38 votes

Déposer le dernier élément avec LINQ

Cela ressemble à une tâche triviale avec LINQ (et c'est probablement le cas), mais je ne peux pas comprendre comment laisser tomber le dernier élément de la séquence avec LINQ. Utilisation Prendre et passer la longueur de la séquence - 1 fonctionne bien évidemment. Cependant, cette approche semble assez peu pratique lors de l'enchaînement de plusieurs LINQ en une seule ligne de code.

IEnumerable<T> someList ....

// this works fine
var result = someList.Take(someList.Count() - 1);


// but what if I'm chaining LINQ ?
var result = someList.Where(...).DropLast().Select(...)......;

// Will I have to break this up?
var temp = someList.Where(...);
var result = temp.Take(temp.Count() - 1).Select(...)........;

En Python, je pourrais juste faire seq[0 :-1]. J'ai essayé de passer -1 à la méthode Take, mais il ne semble pas faire ce dont j'ai besoin.

26voto

Saeed Amiri Points 16317
someList.Reverse().Skip(1).Reverse()

12voto

Jamiec Points 35773

Vous pouvez facilement le faire avec une méthode d'extension, soit en utilisant le formulaire que vous avez déjà trouvé, ou peut-être une combinaison de Take et Count

public static IEnumerable<T> DropLast<T>(this IEnumerable<T> enumerable)
{
  return enumerable.Take(enumerable.Count()-1);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X