IEnumerable<string>
Alfabetik olarak nasıl sıralayabilirim . Mümkün mü?
Düzenleme: Yerinde bir çözümü nasıl yazarım?
Yanıtlar:
Diğer numaralandırılabilirleri sıraladığınız gibi:
var result = myEnumerable.OrderBy(s => s);
veya
var result = from s in myEnumerable
orderby s
select s;
veya (büyük / küçük harfe bakılmaksızın)
var result = myEnumerable.OrderBy(s => s,
StringComparer.CurrentCultureIgnoreCase);
LINQ ile her zamanki gibi, bu, numaralandırıldığında, orijinal IEnumerable <T> öğelerini sıralı sırada döndüren yeni bir IEnumerable <T> oluşturur. Yerinde IEnumerable <T> sıralamaz.
Bir IEnumerable <T> salt okunurdur, yani öğeleri yalnızca ondan alabilir, ancak doğrudan değiştiremezsiniz. Yerinde dizelerin bir koleksiyonunu sıralamak istiyorsanız, önce IEnumerable <string> uygulayan orijinal koleksiyonu sıralamanız veya bir IEnumerable <string> dizesini sıralanabilir bir koleksiyona dönüştürmeniz gerekir:
List<string> myList = myEnumerable.ToList();
myList.Sort();
Yorumunuza göre:
_components = (from c in xml.Descendants("component")
let value = (string)c
orderby value
select value
)
.Distinct()
.ToList();
veya
_components = xml.Descendants("component")
.Select(c => (string)c)
.Distinct()
.OrderBy(v => v)
.ToList();
veya (daha sonra listeye daha fazla öğe eklemek ve sıralı tutmak isterseniz)
_components = xml.Descendants("component")
.Select(c => (string)c)
.Distinct()
.ToList();
_components.Add("foo");
_components.Sort();
OrderBy
döner IOrderedEnumerable<T>
. IOrderedEnumerable<T>
türetildiği IEnumerable<T>
gibi kullanılabilir IEnumerable<T>
, ancak türü genişletir, örneğin kullanımına izin verir ThenBy
.
İmkansız ama değil.
Temel olarak, herhangi bir sıralama yöntemi kopyalamak için gidiyor IEnumerable
bir içine List
sıralayabilir List
ve sonra size bir olan sıralı liste dönmek IEnumerable
bir yanı sıra IList
.
Bu, bir öğesinin "sonsuza kadar devam et" özelliğini kaybettiğiniz anlamına gelir IEnumerable
, ancak daha sonra böyle bir özelliği sıralayamazsınız.
Her zaman yerinde yapamayız, ancak mümkün olduğunda tespit ederiz:
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);
}
Bu, aşağıdaki kullanışlı yapıyı kullanır:
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);
? Ya buna benzemeye ne dersinizlistToSort = (src as List<T>); if (null == listToSort) listToSort = new List<T>(src);