如何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); } }