0

假设 3 个列表存在超过 500,000 条记录,我们需要执行一组操作(子集如下所示):

1) 检查列表一和列表二中的重复 id 并检索不同的 id,同时总结重复 id 的“ValuesA”并将结果放入列表中。让我们将此列表称为 list12。

2) 比较列表 3 list12 之间所有具有匹配 id 的值,并将结果打印到控制台。

3) 确保最佳性能。

这是我到目前为止所拥有的:

var list1 = new List<abc>()
{ 
    new abc() { Id = 0, ValueA = 50},
    new abc() { Id = 1, ValueA = 40},
    new abc() { Id = 1, ValueA = 70}

};

var list2 = new List<abc>()
{ 
    new abc() { Id = 0, ValueA = 40},
    new abc() { Id = 1, ValueA = 60},
    new abc() { Id = 3, ValueA = 20},

};

var list3 = new List<abc>()
{ 
    new abc() { Id = 0, ValueA = 50},
    new abc() { Id = 1, ValueA = 40},
    new abc() { Id = 4, ValueA = 70},

};

1)借助此处 [链接][1] 的解决方案,我能够解决第 1 部分。

var list12 = list2.GroupBy(i => i.Id)
            .Select(g => new
            {
                Id = g.Key,
                NewValueA = g.Sum(j => j.ValueA),
            });

2)我似乎无法从这部分正确获得完整的结果集。我可以获得匹配的帐号,也许有人知道比哈希集更快的方法,但我还需要每个列表中的 ValueA 以及匹配的帐号。

        foreach (var values in list3.ToHashSet().Select(i => i.ID).Intersect(list12.ToHashSet().Select(j => j.UniqueAccount)))
        {
            Console.WriteLine(values)   //prints matching account number

            //?? how do I get ValueA with from both lists with this in the quickest way possible
        }

3)我在网上阅读提高性能的唯一尝试是使用我在上面的尝试中看到的哈希集,但我可能做错了,有人可能有更好的解决方案

4

2 回答 2

0

我不认为任何转换为HashSet​​ ,无论多么有效,都会提高性能。原因是必须枚举列表以创建HashSets,然后HashSet必须枚举 s 以获得结果。

如果将所有内容都放在一个 LINQ 语句中,则枚举的数量将最小化。通过在最后计算总和,计算次数减少到绝对最小值:

list1.Concat(list2)
     .Join(list3, x => x.Id, l3 => l3.Id, (l12,l3) => l12)
     .GroupBy (x => x.Id)
     .Select(g => new
             {
                 Id = g.Key,
                 NewValueA = g.Sum(j => j.ValueA),
             })

根据您的数据,这表明:

    Id  NewValueA
    0   90
    1   170

我不知道我是否很好地理解了所有要求,但这应该会给你一个大致的想法。

于 2013-09-17T12:50:16.037 回答
0

如果您想访问这两个元素,您可能需要加入。连接是一种非常通用的构造,可用于构造所有其他集合操作。

于 2013-09-17T14:37:14.007 回答