8
votes

Méthode d'extension LINQ pour prendre des éléments de la fin de la séquence

Il y a la méthode d'extension énumérable xxx

qui prend le premier compteur du début.

y a-t-il un moyen de prendre les éléments de la fin? Ou même mieux un moyen de prendre les éléments d'un décalage à la fin?

merci


0 commentaires

4 Réponses :


15
votes
var lastFive2 = Enumerable.Range(1, 10).TakeLast2(5); //Bear´s way

//some = Some method which you don't control - it could be from another assembly which represents a crazy plugin etc.
some(lastFive2);
//Now what?

14 commentaires

Yikes, ça va marcher, mais ça ne va pas être efficace, pas plus que ce ne sera élégant.


@Mark comme je l'énonce, je suis d'accord avec vous :) Je vais proposer une méthode plus efficace ...


En outre, en fonction de ce que finitelist est peut-être ou peut même pas être possible de l'énumérer deux fois (que votre deuxième suggestion nécessiterait)


la seconde est bonne, mais d'abord est uuugy


arg. n'a pas vu la méthode de saut


Takelast n'a pas besoin d'être un itérateur comme son agrégation. Les rendements redondants peuvent être remplacés par une file d'attente de retour.


@Bear ahh oui! N'a même pas vu ça: D Merci pour votre contribution :)


@Bear hhm non, pas tout à fait. Un (file d'attente) quelque chose.takelast (5) pourrait donner des résultats inattendus ... mais généralement, ce serait bien :)


@Lasse pas sûr de suivre? Voir Poste ci-dessous pour ce que je voulais dire.


@Bear Oui, je sais ce que vous vouliez dire, mais j'ai mis à jour avec un exemple de ce que je veux dire :)


@Lasse ok je vois ce que vous voulez dire, mais c'est sûr parce que vous ne mutation de la collection source. Néanmoins, votre droit il n'est probablement pas fonctionnel cependant.


@LASSE OK Je concède, je pense que votre approche est meilleure que la mienne;) sa honte lisonlycollection ne prend pas une ICollection puis nous pourrions simplement envelopper la file d'attente et nous gagnons tous les deux!


@Bear J'aime votre solution - je l'utiliserais lorsque vous sautez un énumérateur serait important (correctement pas très souvent, cependant). ReadonlyCollection envelopperait également l'iEnumerable afin qu'il soit correctement mis en œuvre comme ma boucle et donc l'efficacité est partie.


@Lasse Ok Bon point sur Readonlycollection Mais qu'en est-il de ReadonlyEnumérable? Votre pensée serait appréciée. Ive a ajouté la classe à mon message que j'ai fait à mon plus tôt. Je pourrais faire une nouvelle question si vous pensez que c'est assez intéressant.



3
votes

Morelinq fournit un Méthode d'extension de takelast :

var allFromOffsetToEnd = finiteList.Skip(offset);


1 commentaires

+1 presque exactement ce que je suis venu, un peu plus tard que votre message;)



1
votes

une note sur la performance. Beaucoup de réponses ici fonctionnant sur ienumerable <> et c'est probablement ce dont vous avez besoin et devrait utiliser.

Mais si les jeux de données sont volumineux et de type Liste <> ou similaire, vous pouvez empêcher beaucoup d'itération inutile avec quelque chose comme: xxx < / p>


3 commentaires

+1 Et en tant que commentaire, la plupart des codes de .NET Framework (y compris les méthodes LINQ) vérifient si les arguments sont des listes, des tableaux ou des inumérables, puis produisent la réponse la solution la plus efficace :) une méthode combinée serait belle ...


@LASSEE: Je me demandais si cela pouvait fonctionner automatiquement par la résolution de la surcharge ou que vous devez écrire une enveloppe qui utilise est / comme.


La surcharge le ferait, mais un avantage avec l'approche est / comme étant la source, si vous donnez une source, vous ne faites pas une liste, vous devriez alors faire de l'IS / comme vous-même.



2
votes

@Lasseespeholt: xxx


2 commentaires

Qu'est-ce que lisonlyenumerable là pour? Les interfaces iEnumerables sont déjà en lecture seule.


S'il vous plaît voir la réponse acceptée. J'ai ajouté que c'est une réponse à une discussion avec LasseSpeholt. Fondamentalement, il doit se protéger contre la modification par les consommateurs qui pourraient dissimuler le iEnumerable à une file d'attente et le modifier. J'espérais avoir son opinion.