2017-03-12 196 views
0

我已經整理用下面的代碼tuplelist排序列表與

// for loop code 
{ 

list.Add(new Tuple(log[0], "arr")); 

list.Add(new Tuple(log[ 1 ], "dep")); 
} 

// sorts the list 

list.Sort((a, b) => a.Item1.CompareTo(b.Item1)); 

排序後重復值,並根據優先級標記順序,它看起來像這樣

enter image description here

在重複值的情況下, ,我想基於標籤優先級對列表進行排序,例如'arr'應該比'dep'更具優先級,並且應該像這樣來。

enter image description here

如何在C#中執行此操作?

回答

1

你只需要到邏輯添加到您的比較:

list.Sort((a, b) => 
{ 
    int result = a.Item1.CompareTo(b.Item1); 

    return result == 0 ? a.Item2.CompareTo(b.Item2) : result; 
}); 

換句話說,如果Item1性能的比較結果爲相等,則比較Item2值和返回的結果來代替。否則返回原始結果。

請注意,此示例利用了您希望優先考慮的值自然按您想要的順序排序的事實,因爲詞彙"arr"出現在"dep"之前。

使用Sort()方法是最有效的。但是你可以通過使用LINQ來提高代碼的表現力。像這樣:

list = list.OrderBy(x => x.Item1).ThenBy(x => x.Item2).ToList(); 

這將導致額外的內存分配,但對我來說更具可讀性。有關更多示例,請參閱Sorting array by multiple key values

+0

如果它們在詞彙上沒有優先級,例如,而不是「arr」,那麼它是「開始」並且「dep」是「結束」。 – Kanvas

+0

@Kanvas:只要_consistently_有序,就可以顛倒順序。例如。使用'ThenByDescending()'而不是'ThenBy()',或者在第一個例子中,在返回之前保存'Item2'比較結果,並返回'-1'爲正值,'1'爲負值(do_not_屈從於僅僅否定結果的誘惑......如果需要,實際比較可以返回「int.MinValue」,否定依然會給你一個負值,即再次爲「int.MinValue」)。 –