C#Linq有助于提高性能吗?

时间:2013-10-03 19:02:47

标签: c# linq

请原谅我的伪代码。我非常确定有一种神奇的方法可以在单个linq语句中编写它,这也将大大提高性能。这里我列出了AList中的数百万条记录。 id可能不是唯一的。我之后的原始列表是删除所有重复项(基于id),但始终以最早的日期获取记录。当存在重复的id时,mystring几乎总是一个不同的值。

public class A
{
    public string id { get; set; }
    public string mystring { get; set; }
    public DateTime mydate { get; set; }
}

List<A> aListNew = new List<A>();
foreach (var v in AList)
{
    var first = AList.Where(d => d.id == v.id).OrderBy(d => d.mydate).First();

    // If not already added, then we add
    if (!aListNew.Where(t => t.id == first.id).Any())
        aListNew.Add(first);
}

3 个答案:

答案 0 :(得分:5)

您可以直接使用分组在一个LINQ语句中完成此操作:

List<A> aListNew = AList
                   .GroupBy(d => d.id)
                   .Select(g => g.OrderBy(i => i.mydate).First())
                   .ToList();

答案 1 :(得分:4)

最快的可能是一个带字典的直接foreach循环:

Dictionary<int, A> lookup = Dictionary<int, A>();

foreach (var v in AList)
{
    if(!lookup.ContainsKey(v.id))
        // add it
        lookup[id] = v;
    else if (lookup[id].mydate > v.mydate)
        // replace it
        lookup[id] = v;    
}

// convert to list
List<A> aListNew = lookup.Values.ToList();

如果碰撞很少,Linq GroupBy / First()查询可能具有可比性,但由于必须遍历整个列表,因此任何一个将成为O(N)。

答案 2 :(得分:0)

这应该是最简单的。无论如何都不涉及LINQ。

var lookup = Dictionary<int, A>();
foreach(var a in aListNew.OrderByDescending(d => d.mydate)) {
    lookup[a.id] = a;
} 
var result = lookup.Values.ToList();

请注意,子LINQ会损害性能,这就是我选择不使用它的原因。请记住,LINQ可以让您的任务更轻松,而不是让执行更快。