Hashset联合保留组合项的值

时间:2012-10-23 21:01:16

标签: c# linq hash aggregate-functions hashset

我正在寻找有效的方法来组合多个哈希集(基于对象键),同时保留非键值(例如下面的版本)。

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)

这只显示其中一个列表的版本(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);

是否可以使用哈希集?

更新

跟踪哪个列表具有哪个版本(在最终结果中)非常重要。

1 个答案:

答案 0 :(得分: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);

然后你可以迭代每个组,根据EqualsGetHashCode包含相同的值,但仍然可以是不同的。 List值将指示每个项目来自哪个列表。