0

非キー値(以下のバージョンなど)を保持しながら、(オブジェクトキーに基づいて)複数のハッシュセットを組み合わせる効率的な方法を探しています。

class MyObject {
    public string Key {get; set;}
    public long Version {get; set;}
    override GetHashCode() { *key* }
    override Equals(...) { *key* }
}

およびで、ハッシュセットをマスターリストに結合する必要がありますが、すべてのバージョンも結合する必要があります。

この方法で3セットの和集合を作ることができます:

for (var o in List1.Union(List2).Union(List3))
    Console.WriteLine("{0} : {1}", o.Key, o.Version)

これは、リストの1つ(List1、またはアイテムを含むリスト)のバージョンのみを表示します。

これらをすべてのバージョンの結果にコンパイルする必要があります。

私がこのようにできることを望む何か:

for (var o in List1.Union(List2).Union(List3).Select((a,b,c) => new DiffObj(){Key=a.Key,VersionA=a.Version,VersionB=b.Version,VersionC=c.Version}))
    Console.WriteLine("{0} : {1},{2},{3}", o.Key, o.VrsionA, o.VersionB, VersionC);

ハッシュセットでそれは可能ですか?

アップデート

どのリストにどのバージョンが含まれていたかを追跡することが重要です(最終結果)。

4

1 に答える 1

3

グループ化が必要なようです。

var grouped = list1.Select(x => new { List=1, Item=x })
                   .Concat(list2.Select(x => new { List=2, Item=x }))
                   .Concat(list3.Select(x => new { List=3, Item=x }))
                   .GroupBy(pair => pair.Item);

Equals次に、各グループを反復処理できます。各グループには、とに従って等しい値が含まれますがGetHashCode、それでも区別できます。List値は、各アイテムがどのリストからのものであるかを示します。

于 2012-10-23T21:08:07.947 に答える