如何对以下列表进行排序

时间:2011-05-10 10:31:26

标签: c# .net sorting lambda

我有一个名为clusters的列表,在该列表中还有另一个名为tags的列表,其中包含sequenceno。

如何使用一行中使用lambda表达式从每个集群的标签中使用最大值seuqenceno来对集群进行排序。

这样的东西
clusters.Sort((a,b) => a.tags......

2 个答案:

答案 0 :(得分:7)

一种效率不高的解决方案(计算O(N log N)最大值,但就地运行):

clusters.Sort((a,b) => a.tags.Max(x => x.sequenceno)
                        .CompareTo(b.tags.Max(x => x.sequenceno)));

一个更好的解决方案(仅计算O(N)最大值,但不能就地工作):

var max = clusters.ConvertAll(c => c.tags.Max(x => x.sequenceno);
clusters = clusters.Select((x,i) => new{x,i})
                   .OrderBy(xi => max[xi.i].CompareTo(max[xi.j]))
                   .Select(xi => xi.x)
                   .ToList();

如果没有以下任何一种方法,就很难有效地进行这种排序:

  1. 向集群类添加属性以缓存标记的最大序列号(并处理其可能的失效,这可能会变得棘手);
  2. 向集群类添加属性以跟踪其索引(在那里可能没有意义,并且可能也会引发失效问题);
  3. 使用聚类周围的包装器列表来跟踪1和2中提到的任何值;
  4. 滚动自己的排序算法。

答案 1 :(得分:3)

使用LINQ OrderBy:

 var orderedClusters = clusters.OrderBy(list => list.Max(item => item.SequenceNo))