Je travaille avec LINQ à des objets et j'ai une fonction où dans certains cas j'ai besoin de modifier la collection sous-jacente avant d'appeler Aggregate(...)
puis de la remettre dans son état d'origine avant que la fonction renvoie les résultats de Aggregate(...)
. Mon code actuel ressemble à ceci:Quelque chose de mieux que .ToArray() pour forcer l'énumération de la sortie LINQ
bool collectionModified = false;
if(collectionNeedsModification)
{
modifyCollection();
collectionModified = true;
}
var aggregationResult = from a in
(from b in collection
where b.SatisfysCondition)
.Aggregate(aggregationFunction)
select a.NeededValue;
if(collectionModified)
modifyCollection();
return aggregationResult;
Cependant, comme il est écrit, si je modifie la collection, je vais obtenir le mauvais résultat parce que je suis en train de la collection dans son état d'origine avant aggregationResult
soient dénombrés et LINQ les résultats sont paresseux-évalués. Ma solution actuelle est d'utiliser .ToArray()
sur ma requête LINQ comme ceci:
var aggregationResult = (from a in
(from b in collection
where b.SatisfysCondition)
.Aggregate(aggregationFunction)
select a.NeededValue).ToArray();
La taille du tableau résultant sera toujours faible (100 articles) < donc la mémoire/temps de traitement ne sont pas une préoccupation. Est-ce la meilleure façon de gérer mon problème, ou existe-t-il un meilleur moyen de forcer l'évaluation d'une requête LINQ?
Je préfère '.LastOrDefault()'. Notez que 'LastOrDefault' prend également un raccourci (dans ma version, .NET 4.5.2).Si la source est un 'IList <>', elle obtiendra d'abord 'Count', puis utilisera l'indexeur pour obtenir l'élément avec l'index' Count-1'. Par exemple cela fonctionne (utilise Moq): 'var listMock = nouveau Mock> (MockBehavior.Strict); listMock.Setup (x => x.Count) .Retours (666); listMock.Setup (x => x [665]). Renvoie ("dernier"); var last = listMock.Object.LastOrDefault(); ' –