Si j'ai un IEnumerable<Foo> allFoos
et un IEnumerable<Int32> bestFooIndexes
, comment puis-je obtenir un nouveau IEnumerable<Foo> bestFoos
contenant les Foo
entrées de allFoos
aux indices indiqués par bestFooIndexes
?En utilisant LINQ, comment choisir des éléments à des index particuliers?
Répondre
réponse d'Élisée va certainement travailler, mais il peut être très inefficace ... cela dépend de ce allFoos
est mis en œuvre par. Si c'est une implémentation de IList<T>
, ElementAt
sera efficace - mais si c'est en fait le résultat de (par exemple) une requête LINQ to Objects, alors la requête sera relancée pour chaque index. Donc, il peut être plus efficace d'écrire:
var allFoosList = allFoos.ToList();
// Given that we *know* allFoosList is a list, we can just use the indexer
// rather than getting ElementAt to perform the optimization on each iteration
var bestFoos = bestFooIndexes.Select(index => allFoosList[index]);
Vous pourriez à ce que lorsque cela est nécessaire, bien sûr:
IList<Foo> allFoosList = allFoos as IList<Foo> ?? allFoos.ToList();
var bestFoos = bestFooIndexes.Select(index => allFoosList[index]);
Vous voulez probablement dire 'bestFooIndexes.Select (index => allFoosList [index]' –
@Dan: Oui, merci - fixe –
+1: J'aime le "comme IList
var bestFoos = bestFooIndexes.Select(index => allFoos.ElementAt(index));
Si vous êtes inquiet sur les performances et les collections sont grandes engouh:
List<Foo> allFoosList = allFoos.ToList();
var bestFoos = bestFooIndexes.Select(index => allFoosList[index]);
@Timwi: J'étais au milieu de l'écriture exactement cette suggestion :) –
Vous pouvez faire une méthode d'extension comme ceci:
public IEnumerable<T> ElementsAt(this IEnumerable<T> list, IEnumerable<int> indexes)
{
foreach(var index in indexes)
{
yield return list.ElementAt(index);
}
}
Ensuite, vous pouvez aller quelque chose comme ça
var bestFoos = allFoos.ElementsAt(bestFooIndexes);
Pourquoi le vote vers le bas? – PostMan
Dunno. Je l'aime - ça rime avec ce que j'utilise déjà pour en choisir un: 'var bestFoo = allFoos.ElementAtOrDefault (bestFooIndex)' –
La réponse de Jon Skeet/Elisha est la voie à suivre.
est ici une solution légèrement différente, moins efficace, selon toute vraisemblance:
var bestFooIndices = new HashSet<int>(bestFooIndexes);
var bestFoos = allFoos.Where((foo, index) => bestFooIndices.Contains(index));
Répète contenues dans bestFooIndexes
ne produira pas de doublons dans le résultat. De plus, les éléments du résultat seront classés par leur ordre d'énumération au allFoos
plutôt que selon l'ordre dans lequel ils sont présents dans bestFooIndexes
.
Une autre solution basée sur rejoindre:
var bestFoos = from entry in allFoos
.Select((a, i) = new {Index = i, Element = a})
join index in bestFooIndexed on entry.Index equals index
select entry.Element;
var = bestFoosFromAllFoos allFoos.Where ((s) => bestFoos.Contains (s));
- 1. Linq-sql classes à choisir en utilisant
- 2. Comment supprimer des caractères particuliers d'une chaîne en utilisant XSLT?
- 3. Comment extraire des mots particuliers d'un paragraphe en utilisant PHP?
- 4. jQuery sélectionne tous les éléments à l'intérieur des éléments parents particuliers
- 5. Comment extraire des éléments d'une liste en utilisant des index en Python?
- 6. Trouver des indices d'éléments particuliers dans la liste en utilisant linq
- 7. choisir des éléments de tableau qui contient des entiers
- 8. Index des éléments, jQuery ou Javascript
- 9. Linq à Xml et créer des éléments
- 10. Comment obtenir des éléments alternatifs en utilisant Enumerable en C#
- 11. Comment choisir au hasard des éléments d'un tableau?
- 12. Dans Perforce P4V, comment rechercher des listes de modifications avec des fichiers dans des dossiers particuliers?
- 13. Comment obtenir des éléments par nom en XML en utilisant LINQ
- 14. Utilisation de jQuery NOT sélecteur pour exclure des éléments avec des enfants particuliers.
- 15. Comment sélectionner des éléments dans une variable en utilisant jQuery?
- 16. XML Traversant, copier des éléments et des nœuds en utilisant LINQ to XML
- 17. Obtention d'un index dans un vecteur en utilisant des itérateurs
- 18. Comment déplacer des éléments html en utilisant Javascript?
- 19. Comment obtenir des chevauchements de tableaux en utilisant LINQ?
- 20. comment enregistrer des éléments triables en mvc
- 21. boucler des éléments en utilisant xPath
- 22. Traiter n éléments à la fois (en utilisant des threads)
- 23. Comment sélectionner des éléments dans une liste en utilisant jQuery?
- 24. Comment saisir des éléments d'image PDF en utilisant C#
- 25. Comment supprimer des éléments de XML en utilisant Python
- 26. Naviguer dom en utilisant jquery pour obtenir des éléments spécifiques
- 27. En cliquant sur "Choisir des éléments" dans la boîte à outils se bloque Visual Studio 2008
- 28. en utilisant XPath comment sélectionner des éléments avec l'attribut absent
- 29. Comment cacher et afficher des éléments HTML en utilisant JQuery?
- 30. Comment supprimer des nœuds spécifiques à partir d'un fichier XML en utilisant LINQ en C#
Héhé, regardez combien d'attention vous avez;) –
Si allFoos est indexable alors pourquoi ne pas utiliser IList au lieu de IEnumerable et éviter les conversions/conversions requises dans les exemples ci-dessous? –
@ user373743 Parce qu'il a écrit qu'il utilise un IEnumerable. –