2010-10-09 40 views
2

我有这样定义的列表...按属性/匿名函数排序列表?

var sets = new List<HashSet<int>>(numSets); 

为什么没有超载,所以我可以这样排序呢?我想要最大的一组。最简单的方法是什么?

回答

6

因为List<T>类是在.NET 2.0中引入的,所以这个类的设计者决定如此。你可以使用OrderByDescending扩展方法:

sets = sets.OrderByDescending(s => s.Count).ToList(); 
+0

这将按升序排序。 OP希望最大的一组。你需要'OrderByDescending'。 – Ani 2010-10-09 08:35:08

+0

@Ani,正确。我更新了我的帖子以反映这一点。感谢您指出。 – 2010-10-09 08:37:11

+0

这两种解决方案看起来都不错......我会等着看看谁会在我选择之前获得更多选票:P谢谢!我喜欢这个人阅读的容易程度。 – mpen 2010-10-09 09:01:41

4

试试这个:

sets.Sort((setA, setB) => setB.Count.CompareTo(setA.Count)); 

它使用Sort(Comparison<T> comparison)超载的List<T>.Sort。 表达式将B与A比较而不是A与B进行比较的事实是生成您需要的按递减顺序排列的顺序。

您的代码无法正常工作的原因是因为List<T>.SortEnumerable.OrderByDescending不同,没有接受Func<TSource, TKey>密钥选择器的超载。

@Darin Dimitrov的使用OrderByDescending的技术也很好,但请注意,这将创建一个排序列表,并将原始列表中的引用重新分配给新排序的列表。

+0

哦......所以有一个匿名函数超载。我看到'比较<>'的东西,但我不知道它是什么。 – mpen 2010-10-09 08:26:04

+0

重新分配是好的...但哪个更有效率?我猜这是因为它在原地。 OTH,他的读法更像英文。 – mpen 2010-10-09 08:45:14

+0

@Mark:就地的*应该更有效率。当然,找出问题的唯一方法就是测量。我同意你的可读性。为了充分利用这两种解决方案,您可能需要考虑使用键选择器参数为'List '写一个扩展方法。 – Ani 2010-10-09 08:55:10