如何sorting一个IEnumerable <string>

如何按字母顺序sortingIEnumerable<string> 。 这可能吗?

编辑:我将如何编写一个就地解决scheme?

用同样的方法sorting其他的枚举:

 var result = myEnumerable.OrderBy(s => s); 

要么

 var result = from s in myEnumerable orderby s select s; 

或(忽略大小写)

 var result = myEnumerable.OrderBy(s => s, StringComparer.CurrentCultureIgnoreCase); 

请注意,与LINQ一样,这将创build一个新的IEnumerable <T>,枚举时按照sorting顺序返回原始IEnumerable <T>的元素。 它不就地sortingIEnumerable <T>。


IEnumerable <T>是只读的,也就是说,您只能从中检索元素,但不能直接修改它。 如果要在原地sortingstring集合,则需要对实现IEnumerable <string>的原始集合进行sorting,或者先将IEnumerable <string>转换为可sorting的集合:

 List<string> myList = myEnumerable.ToList(); myList.Sort(); 

根据你的评论:

 _components = (from c in xml.Descendants("component") let value = (string)c orderby value select value ) .Distinct() .ToList(); 

要么

 _components = xml.Descendants("component") .Select(c => (string)c) .Distinct() .OrderBy(v => v) .ToList(); 

或者(如果您稍后要将更多的项目添加到列表并保持sorting)

 _components = xml.Descendants("component") .Select(c => (string)c) .Distinct() .ToList(); _components.Add("foo"); _components.Sort(); 

这是不可能的,但事实并非如此。

基本上,任何sorting方法将复制IEnumerable到列表,sorting列表,然后返回给您sorting的列表,这是一个IEnumerable以及IList

这意味着你失去了一个IEnumerable的“继续无限”属性,但是你无法按照那样sorting。

 myEnumerable = myEnumerable.OrderBy(s => s); 

我们不能总是在原地进行,但是我们会发现什么时候有可能:

 IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, IComparer<T> cmp) { List<T> listToSort = (src is List<T>) ? (List<T>)src : new List<T>(src); listToSort.Sort(cmp); return listToSort; } IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, Comparison<T> cmp) { return SortInPlaceIfCan(src, new FuncComparer<T>(cmp)); } IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src) { return SortInPlaceIfCan(src, Comparer<T>.Default); } 

这使用以下方便的结构:

 internal struct FuncComparer<T> : IComparer<T> { private readonly Comparison<T> _cmp; public FuncComparer(Comparison<T> cmp) { _cmp = cmp; } public int Compare(T x, T y) { return _cmp(x, y); } }