回答:
他の列挙可能なものを並べ替えるのと同じ方法:
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から要素を取得することはできますが、直接変更することはできません。文字列のコレクションをインプレースで並べ替える場合は、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);