Відповіді:
Так само, як ви сортуєте будь-яку іншу кількість:
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);