List.Sort(自定义排序...)
我有一个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