Linq Sélectionner et de les Agréger au sein d'une seule itération
Est-il un moyen de le faire avec linq sans l'énumération des fooCollection
deux fois?
var fooCollection = //get foo
var selectedIds = new List<int>();
var aggregateContent = String.Empty;
foreach (var f in foo)
{
selectedIds.Add(foo.Id);
aggregateContent += foo.Content
}
var results = new FooResults
{
Content = aggregateContent,
SelectedIds = selectedIds
};
return results;
OriginalL'auteur Nick | 2012-10-17
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez utiliser le Énumérable.Agrégation méthode:
Cela a l'avantage d'être sans effets secondaires. Je n'aime pas les effets secondaires dans mon LINQ. =)
+1: Belle utilisation de la
Aggregate
méthode. TIL.OriginalL'auteur Jens
Il y a une possibilité, mais je considère que c'est un hack:
Je voudrais aller avec la boucle que vous avez déjà. Il est beaucoup plus propre que toutes les requêtes LINQ solution vous pouvais venir.
OriginalL'auteur Daniel Hilgarth
Vous pourriez faire ceci:
Je recommanderais de ne pas concaténer le Contenu dans une chaîne de caractères, mais l'utilisation d'un
StringBuilder
à la place.MODIFIER
Si vous n'avez pas une extension LINQ bibliothèque qui implémente
ForEach
pourIEnumerable
, voici une méthode que vous pouvez utiliser:ForEach
n'existe pas pourIEnumerable<T>
. Il est membre de la méthode deList<T>
.Merci Daniel, j'ai étendu ma réponse en conséquence.
Je seconde @Daniel 's commentaire: Liste.Foreach n'a rien à voir avec linq. (La question demande une LINQ solution).
C'est ce qu'il a demandé littéralement, mais il n'a pas vraiment demander une mise en œuvre efficace?
Je peux aussi
.ToArray()
la fooCollection afin d'utiliserForEach
. Merci.OriginalL'auteur Roy Dictus
Ce que vous demandez est d'avoir une Linq déclaration de produire deux résultats.
L'idée de linq est de permettre une description concise de la programmation fonctionnelle style sans effets secondaires.
Si vous souhaitez que plusieurs des résultats et de bonnes performances, vous ne devriez pas être à l'aide de Linq, et d'utiliser un foreach.
OriginalL'auteur
Je ne le trouve pas trop donc j'écris mes propres comme ce
OriginalL'auteur Thaina