【问题标题】:Hashet union with preserving values from combined items保留组合项中的值的哈希集联合
【发布时间】:2012-10-23 21:01:16
【问题描述】:

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

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);

哈希集有可能吗?

更新

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

【问题讨论】:

    标签: c# linq hash aggregate-functions hashset


    【解决方案1】:

    听起来你想要一个分组:

    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 值将指示每个项目来自哪个列表。

    【讨论】:

    • 一旦我连接,我将失去对象来自哪个列表的来源,对吗?我需要明确知道哪个来源(列表)有哪个版本。
    • @SonicSoul:这个问题并不清楚......请在未来更具体。正在编辑...
    • 感谢乔恩。是的,会做到的。我什至没有想过要进行分组,因为我认为哈希集联合有一种更有效的方法..
    • @SonicSoul:请记住,分组仍将在幕后使用散列 - 它基本上是 Dictionary<TKey, List<TValue>>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2017-12-06
    • 2020-10-09
    相关资源
    最近更新 更多