3

次のようなクラスがあるとします...

public class IntGroup {
  public string GroupName {get; set;}
  public List<int> Integers {get; set;}
}

...そして、それぞれが整数のコレクションを含むいくつかのインスタンスがあります。個別の整数を含むグループの最小セットを見つけたいと考えています。

たとえば、次のグループがある場合...

グループ 1 には 1、2、3 が含まれます
グループ 2 には 4、5、6 が含ま
れます グループ 3 には 4、5、9 が含まれます

...次に、グループ 1 には他のグループにはない 3 つの整数が含まれているため、それ自体がグループの最小セット (この場合は 1 つのセット) です。グループ 2 と 3 を一緒にすると、両方のグループを一緒にする必要があるという点で (どちらも 4 と 5 が含まれているため)、別の最小のセットですが、グループ 1 は必要ありません。

これらの最小グループを見つけるのに役立つ C# コードを書きたいと思います。これは、Linq で非常にエレガントに解決できると私が感じる種類の問題ですが、その方法はわかりません。

誰でも助けることができますか?ところで、これは宿題の質問ではありません。私は 51 歳のプログラマーであり、関数呼び出しのツリーを構築するというより大きな問題の一部を解決しようとしており、ツリーの個別の部分を見つけたいと考えています。

ご協力いただきありがとうございます。

4

1 に答える 1

2

最初にこのクラスを定義します。

class ValueIEnumerableComparer<T> : IEqualityComparer<IEnumerable<T>>
{
    public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(IEnumerable<T> obj)
    {
        return obj.Sum(i => i.GetHashCode());
    }
}

次に、このチェーンを使用できます。

int[][] groups =
{
    new[] {1, 2, 3}, 
    new[] {4, 5, 6},
    new[] {4, 5, 9}
};
var result = groups.
    GroupBy(array => groups.
        Where(other => array != other).
        SelectMany(other => array.Intersect(other)), 
            new ValueIEnumerableComparer<int>()).
    Select(g => g.ToArray()).
    ToArray();

配列を交差点でグループ化し、グループから配列のみを選択します。実装するクラスを定義するIEqualityComparer<IEnumerable<T>>必要がありました。要素を比較する比較子を定義せずに、2つのシーケンスのキーを抽出するためのより良い方法を見つけることができませんでした。そのGetHashCode()方法は実際には派手ではありませんが、この例では機能します。

自分のケースにも簡単に適応できますが、一般的なものを持ってくると、質問を読む人にとってはもっと役立つと思いました。

于 2013-01-15T17:18:29.327 に答える