2010-06-25 125 views
11

我有一個List對象,其中包括3項:部分,全部爲H,且全部爲O.List.Sort(自定義排序...)

我這個列表綁定到一個asp OptionButtonList,和它按字母順序排序。不過,我想對列表進行排序如下所示:

全額H,部分,全部爲O.

我怎樣才能做到這一點?

+2

什麼是 「全爲H,部分,全部要怎麼辦?」添加一些你到目前爲止的代碼。 – 2010-06-25 15:51:29

+0

如果您發現它最有用,請記住接受答案 – 2010-06-25 16:40:11

回答

20

Linq非常適合這個。您甚至可以構建訂單序列,以便在執行排序前不會執行直到ToList

var sortedList = yourList.OrderBy(i => i.FullToH). 
    ThenBy(i => i.Partial). 
    ThenBy(i => i.FullToO).ToList(); 
0

爲您的自定義類型(實現IComparer接口)創建比較器。然後,您可以用它來排序列表:

List<CustomType> list = new List<CustomType>(); 

// Fill list 
list.Sort(new CustomComparer()); 

或者,如果您使用的框架的新版本,不需要再使用排序邏輯,你可以使用IEnumerable<T>.OrderBy()方法。

6

你上市(FullToHo例如)只是字符串的項目?如果是這樣,那麼你所需要做的就是編寫一個方法來進行比較,並用該方法進行排序。

public int CompareEntries(string left, string right) { 
    const string fullToH = "Full To H"; 
    const string partial = "Partial"; 
    const string fullToO = "Full To O"; 
    if (left == right) { 
    return 0; 
    } else if (left == fullToH) { 
    return -1; 
    } else if (left == fullToO) { 
    return 1; 
    } else if (right == fullToH) { 
    return 1; 
    } else { 
    return -1; 
    } 
} 

list.Sort(CompareEntries); 
3

假設您的列表不是

List<object> myList = new List<object>(); 

而是像

List<MyObjectClass> myList = new List<MyObjectClass>(); 

(其中每個元素都是相同的對象類型)

你可以這樣做這個:

myList.Sort((firstObj, secondObj) => 
    { 
     return firstObj.SomeProperty.CompareTo(secondObj.SomeProperty); 
    } 
); 
9

感謝大家的幫忙!

我做了這樣的:

List<string> sortedList = new List<string>(); 
sortedList = list.OrderBy(i => i.CodeValue == "FullToH").ThenBy(i => i.CodeValue == "Partial").ThenBy(i => i.CodeValue == "FullToO").ToList(); 

然後綁定到排序列表!

+2

第一行中的分配是不必要的。這是更好的: 列表 sortedList = list.OrderBy ..... – oferei 2016-06-19 19:00:24

+0

我試過這個,它不工作! – 2016-08-15 18:57:42

7

好吧,我知道這是一個數歲,但我有一個替代的解決方案,我認爲是比上述方案更優雅,未來的讀者可能要考慮:

在你的類:

static readonly List<String> codeValueSortOrder = new List<String> { 
    "Full To H", 
    "Partial", 
    "Full To O" 
}; 

,並在你的方法:

sortedList = list.OrderBy(i=> codeValueSortOrder.IndexOf(i.CodeValue)); 
+2

注意:對於真正的代碼,使用'Dictionary'而不是'codeValueSortOrder'列表將O(1)搜索和整體O(n log n)替換爲'Dictionary [value]'而不是O(n^2 log n) List.IndexOf' – 2016-01-29 00:46:33