我有一個List對象,其中包括3項:部分,全部爲H,且全部爲O.List.Sort(自定義排序...)
我這個列表綁定到一個asp OptionButtonList,和它按字母順序排序。不過,我想對列表進行排序如下所示:
全額H,部分,全部爲O.
我怎樣才能做到這一點?
我有一個List對象,其中包括3項:部分,全部爲H,且全部爲O.List.Sort(自定義排序...)
我這個列表綁定到一個asp OptionButtonList,和它按字母順序排序。不過,我想對列表進行排序如下所示:
全額H,部分,全部爲O.
我怎樣才能做到這一點?
Linq非常適合這個。您甚至可以構建訂單序列,以便在執行排序前不會執行直到ToList
。
var sortedList = yourList.OrderBy(i => i.FullToH).
ThenBy(i => i.Partial).
ThenBy(i => i.FullToO).ToList();
爲您的自定義類型(實現IComparer接口)創建比較器。然後,您可以用它來排序列表:
List<CustomType> list = new List<CustomType>();
// Fill list
list.Sort(new CustomComparer());
或者,如果您使用的框架的新版本,不需要再使用排序邏輯,你可以使用IEnumerable<T>.OrderBy()
方法。
你上市(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);
假設您的列表不是
List<object> myList = new List<object>();
而是像
List<MyObjectClass> myList = new List<MyObjectClass>();
(其中每個元素都是相同的對象類型)
你可以這樣做這個:
myList.Sort((firstObj, secondObj) =>
{
return firstObj.SomeProperty.CompareTo(secondObj.SomeProperty);
}
);
感謝大家的幫忙!
我做了這樣的:
List<string> sortedList = new List<string>();
sortedList = list.OrderBy(i => i.CodeValue == "FullToH").ThenBy(i => i.CodeValue == "Partial").ThenBy(i => i.CodeValue == "FullToO").ToList();
然後綁定到排序列表!
第一行中的分配是不必要的。這是更好的: 列表
我試過這個,它不工作! – 2016-08-15 18:57:42
好吧,我知道這是一個數歲,但我有一個替代的解決方案,我認爲是比上述方案更優雅,未來的讀者可能要考慮:
在你的類:
static readonly List<String> codeValueSortOrder = new List<String> {
"Full To H",
"Partial",
"Full To O"
};
,並在你的方法:
sortedList = list.OrderBy(i=> codeValueSortOrder.IndexOf(i.CodeValue));
注意:對於真正的代碼,使用'Dictionary'而不是'codeValueSortOrder'列表將O(1)搜索和整體O(n log n)替換爲'Dictionary [value]'而不是O(n^2 log n) List.IndexOf' – 2016-01-29 00:46:33
什麼是 「全爲H,部分,全部要怎麼辦?」添加一些你到目前爲止的代碼。 – 2010-06-25 15:51:29
如果您發現它最有用,請記住接受答案 – 2010-06-25 16:40:11