2010-04-20 50 views
4

我有一個項目在一個通用的列表的列表:爲什麼我的List.Sort方法在C#中顛倒了我的列表的順序?

  • A1(排序索引1)
  • A2(排序索引2)
  • B1(排序索引3)
  • B2(排序索引3)
  • B3(排序索引3)

它們比較採取以下形式:

this.sortIndex.CompareTo(other.sortIndex) 

當我做了List.Sort()的項目列表中,我得到以下順序列於:

  • A1
  • A2
  • B3
  • B2
  • B1

它顯然在這樣的意義上工作,即排序索引在右邊訂單,但我真的不希望它重新訂購'B'項目。

是否有任何調整我可以讓我的比較器來解決這個問題?

+0

可能重複http://stackoverflow.com/questions/800007/why-does-listt -sort-method-reorder-equal-icomparablet-elements) – nawfal 2014-06-13 12:02:52

回答

5

OrderBy爲了保持同等項目:

myList = myList.OrderBy(item => item.SortIndex).ToList(); 
1

你可以改變你的比較做就值一個次要排序:

if (this.sortIndex.CompareTo(other.sortIndex) == 0) // same sortIndex 
{ 
    return this.Value.CompareTo(other.Value); 
} 
return 0; 
+0

這不是和我發佈的例子完全一樣嗎? – 2010-04-20 10:35:09

+0

@Fiona:不,代碼在次要比較中使用該值,但如果要使用該值,則必須進行一些更正,因爲它通過返回零而不是結果來擾亂主要比較。 – Guffa 2010-04-20 10:42:52

+0

啊我明白了。我沒有真正使用的輔助比較(雖然我可以添加一個人造的,而且工作正常),我想保留的列表順序基於非常複雜的遞歸函數的輸出。 – 2010-04-20 10:58:37

1

排序使用快速排序,它並不能保證原序列在比較相等的情況下。

如果你仍然想使用List.Sort你可以與原來的指標增加第二個比較像:

int c = this.sortIndex.CompareTo(other.sortIndex); 
if (c == 0) 
    c = this.originalIndex.CompareTo(other.originalIndex); 
return c; 

否則,你可以與其他「穩定」算法(例如LINQ的OrderBy)排序。

2

StableSort()List<T>擴展方法是here

的[爲什麼列表 的.sort方法重新排序等於IComparable的 元件?](
相關問題