List.Sort(自定义排序...)

List.Sort(自定义排序...)

问题描述:

我有一个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

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(); 

然后绑定到排序列表!

+2

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

+0

我试过这个,它不工作! – 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)); 
+2

注意:对于真正的代码,使用'Dictionary'而不是'codeValueSortOrder'列表将O(1)搜索和整体O(n log n)替换为'Dictionary [value]'而不是O(n^2 log n) List.IndexOf' – 2016-01-29 00:46:33