2010-10-09 39 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