Comment puis-je sortinger un IEnumerable
par ordre alphabétique. Est-ce possible?
Edit: Comment pourrais-je écrire une solution sur place?
De la même façon que vous sortingez les autres énumérables:
var result = myEnumerable.OrderBy(s => s);
ou
var result = from s in myEnumerable orderby s select s;
ou (en ignorant le cas)
var result = myEnumerable.OrderBy(s => s, SsortingngComparer.CurrentCultureIgnoreCase);
Notez que, comme d’habitude avec LINQ, cela crée un nouveau IEnumerable
Un IEnumerable
List myList = myEnumerable.ToList(); myList.Sort();
Basé sur votre commentaire:
_components = (from c in xml.Descendants("component") let value = (ssortingng)c orderby value select value ) .Distinct() .ToList();
ou
_components = xml.Descendants("component") .Select(c => (ssortingng)c) .Distinct() .OrderBy(v => v) .ToList();
ou (si vous souhaitez append ultérieurement d’autres éléments à la liste et la conserver)
_components = xml.Descendants("component") .Select(c => (ssortingng)c) .Distinct() .ToList(); _components.Add("foo"); _components.Sort();
C’est impossible, mais ce n’est pas le cas.
Fondamentalement, toute méthode de sorting va copier votre IEnumerable
dans une List
, sortinger la List
, puis vous renvoyer la liste sortingée, qui est un IEnumerable
et un IList
.
Cela signifie que vous perdez la propriété “continue infiniment” d’un IEnumerable
, mais vous ne pouvez pas en sortinger un comme ça de toute façon.
myEnumerable = myEnumerable.OrderBy(s => s);
Nous ne pouvons pas toujours le faire sur place, mais nous détectons quand c’est possible:
IEnumerable SortInPlaceIfCan(IEnumerable src, IComparer cmp) { List listToSort = (src is List ) ? (List )src : new List (src); listToSort.Sort(cmp); return listToSort; } IEnumerable SortInPlaceIfCan(IEnumerable src, Comparison cmp) { return SortInPlaceIfCan(src, new FuncComparer (cmp)); } IEnumerable SortInPlaceIfCan(IEnumerable src) { return SortInPlaceIfCan(src, Comparer .Default); }
Cela utilise la structure pratique suivante:
internal struct FuncComparer : IComparer { private readonly Comparison _cmp; public FuncComparer(Comparison cmp) { _cmp = cmp; } public int Compare(T x, T y) { return _cmp(x, y); } }