我正在寻找有效的方法来组合多个哈希集(基于对象键),同时保留非键值(例如下面的版本)。
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);
是否可以使用哈希集?
更新
跟踪哪个列表具有哪个版本(在最终结果中)非常重要。
答案 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);
然后你可以迭代每个组,根据Equals
和GetHashCode
包含相同的值,但仍然可以是不同的。 List
值将指示每个项目来自哪个列表。