Quelle est la bonne façon d'aller sur la création d'une liste de, disons, le premier élément de chaque Tuple
dans un List
de Tuples
?
Si j'ai un List<Tuple<string,string>>
, comment pourrais-je obtenir un List<string>
de la première chaîne de chaque Tuple
?
OriginalL'auteur Wilson | 2013-01-15
Un peu Linq fera l'affaire:
Comme explication, puisque Tim posté à peu près la même réponse, Sélectionnez() crée un rapport de 1:1 "projection"; il prend chaque élément de l'Énumération, et pour chacun d'eux, il évalue la lambda expression et renvoie le résultat sous forme d'un élément d'une nouvelle Énumérable ayant le même nombre d'éléments. ToList() tournez ensuite à travers la Énumérable produit par Select(), et ajouter chaque élément un à un, à un nouveau
List<T>
instance.Tim a un bon point sur la mémoire de l'efficacité énergétique; ToList() permet de créer une liste et d'y ajouter les éléments un à la fois, ce qui va provoquer la Liste à garder le redimensionnement de ses sous-jacent tableau, en doublant à chaque fois pour s'assurer qu'il a la bonne capacité. Pour une grande liste, qui pourrait causer des OutOfMemoryExceptions, et il sera la cause de la CLR pour allouer plus de mémoire que nécessaire pour la Liste, sauf si le nombre d'éléments qui arrive à être une puissance de 2.
OriginalL'auteur KeithS
ou, peut-être moins de mémoire cher:
car elle évite le doublement de l'algorithme de
List.Add
dansToList
.Oui, elle a mentionné simplement parce que les gens sont parfois trop généreux avec
ToList
ouToArray
. Lorsque le seqeunce est grand, vous pouvez éviterOutOfMemoryExceptions
avec la deuxième approche. Il peut sans danger jusqu'à 50% de la mémoire. Ne l'oublierai jamais, moi-même: stackoverflow.com/questions/10519275/...D'une manière plus concise est de passer dans l'interface IEnumerable à la liste de constructeur. La Liste taille lui-même à exactement le besoin de la capacité, et ce sera un one-liner.
Non, cela ne fonctionne que si le
IEnumerable
peut être castée pourICollection
ce n'est pas le cas ci-dessus. DoncToList
énumère l'ensemble de la séquence à l'aide deList.Add
(avec ou sans le constructeur).Un coup d'oeil à TypeDescriptor dos vous. Mon erreur (ou plutôt, MSDN de l'erreur, puisqu'il fait valoir que la Liste va être de taille appropriée).
OriginalL'auteur Rango
Si vous avez un
List<Tuple<string, string>> listoftuples
, vous pouvez utiliser la Liste de mise en œuvre de la méthode Select de prendre la première chaîne de chaque Tuple.Il devrait ressembler à ceci:
List<T>
; il fait partie du Système.Linq bibliothèque.Droit, mais la Liste a un mise en œuvre. J'ai clarifié ma réponse un peu.
Select
est une extension de la méthode définie dansEnumerable<T>
et travaillera avec tout ce que la mise en œuvre deIEnumerable<T>
-List<T>
est rien de spécial dans ce contexte.Il ne le fait pas. De vérifier la MSDN docs. C'est une méthode d'extension, qui peut être appliqué à une Liste parce que les Listes sont ILists qui sont IEnumerables. Cependant, il est défini par le Système statique.Linq.Énumérable classe. msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx
Intéressant. Ne le savais pas. Mon point est simplement que la méthode de sélection peut être utilisé puisque c'est (mieux)traités dans les autres réponses, je vais probablement juste de supprimer le mien.
OriginalL'auteur yoozer8
Generialised Variante:
pour le choix d'un article en particulier, où la collection de n-uplet de la longueur est inconnu, je.e 2,3,4 ...:
où indice'valeur correspond à la manière dont les tuples sont énumérés je.e 1,2,3 ... (pas 0,1,2...).
OriginalL'auteur Declan Taylor