2010-10-02 67 views
9

IList没有Sort()功能。 someoene能帮助我吗? 我想排序我自己的IList。如何分类IList <Class>?

想这是我的IList:

public class MyObject() 
{ 
public int number { get; set; } 
public string marker { get; set; } 
} 

如何排序MyObj中使用标记字符串?

public void SortObject() 
{ 
IList<MyObject> myobj = new List<MyObject>(); 
} 
+1

“myobj”总是“List”吗?如果是这样,你可以将它转换为'List'并运行它的'Sort'函数。 – Gabe 2010-10-02 05:12:25

回答

16

使用OrderBy

public class MyObject() 
{ 
    public int number { get; set; } 
    public string marker { get; set; } 
} 

IList<MyObject> myobj = new List<MyObject>(); 
var orderedList = myobj.OrderBy(x => x.marker).ToList(); 

对于不区分大小写的,你应该使用的IComparer

public class CaseInsensitiveComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     return string.Compare(x, y, StringComparison.OrdinalIgnoreCase); 
    } 
} 

IList<MyObject> myobj = new List<MyObject>(); 
var orderedList = myobj.OrderBy(x => x.marker, new CaseInsensitiveComparer()).ToList(); 
+0

谢谢@布鲁诺这有助于。 – Rye 2010-10-02 05:51:11

+1

+1用于考虑区分大小写,但框架已经有不区分大小写的字符串比较器,不需要创建一个。尝试StringComparer.OrdinalIgnoreCase而不是您的CaseInsensitiveComparer。 – Joe 2010-10-02 07:20:09

0
var sorted = myObj.OrderBy(x => x.marker); 
9

我会用OrderBy与列表去,因为它是一个LINQ扩展方法,因此:

  • 它将列表包装在一个枚举中,然后枚举它并填充一个新的临时列表,然后对这个新列表进行排序。
  • 它将排序的列表包装在另一个可枚举的列表中。
  • 然后,当你打电话给ToList()时,它在它上进行迭代并用项目填充另一个新列表。

实质上:除了实际的排序外,它还创建并填充2个新列表和2个枚举类型。 比较而言,List.Sort()就地排序并不会产生任何影响,因此效率更高。

我的建议是:

  • 如果你知道的基本类型,使用List.Sort()Array.Sort(array)
  • 如果你不知道的基本类型,列表复制到一个临时数组,并使用排序呢Array.Sort(array)并返回。