请原谅我的伪代码。我非常确定有一种神奇的方法可以在单个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);
}
答案 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可以让您的任务更轻松,而不是让执行更快。