Answers:
对其他所有枚举进行排序的方式相同:
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一样,这将创建一个新的IEnumerable <T>,在枚举时将按排序顺序返回原始IEnumerable <T>的元素。它不会就位对IEnumerable <T>进行排序。
IEnumerable <T>是只读的,也就是说,您只能从中检索元素,而不能直接对其进行修改。如果要就地对字符串集合进行排序,则需要对实现IEnumerable <string>的原始集合进行排序,或者首先将IEnumerable <string>转换为可排序的集合:
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();
或(如果您以后想将更多项目添加到列表中并保持排序)
_components = xml.Descendants("component")
.Select(c => (string)c)
.Distinct()
.ToList();
_components.Add("foo");
_components.Sort();
OrderBy
返回IOrderedEnumerable<T>
。IOrderedEnumerable<T>
派生自,IEnumerable<T>
因此它可以像一样使用IEnumerable<T>
,但它扩展了类型,例如允许使用ThenBy
。
这是不可能的,但事实并非如此。
基本上,任何排序方法都会将您复制IEnumerable
到中List
,对进行排序List
,然后再将排序后的列表返回给您,该列表既是IEnumerable
也是IList
。
这意味着您失去了的“无限连续”属性IEnumerable
,但是无论如何都无法对它进行排序。
我们不能总是就地执行此操作,但是我们会检测何时可行:
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);
}
}
listToSort = (src is List<T>) ? (List<T>)src : new List<T>(src);
?感觉怎么样listToSort = (src as List<T>); if (null == listToSort) listToSort = new List<T>(src);