-1
votes

Somme en utilisant linq c #

Comment puis-je obtenir la matrice de résultat à l'aide de LINQ?

for (int i = 0; i < items.Length; i++)
{
 if (i == 0)
    result[i] = max - items[i];
 else
    result[i] = result[i - 1] - items[i];
}


6 commentaires

Ceci est une description de la tâche. Pouvez-vous s'il vous plaît décrire le problème que vous avez résolu cette tâche? Astuce: Vous recherchez agrégat


Qu'est-ce que tu as essayé jusque-là ?


Ce n'est pas une bonne question. S'il vous plaît expliquer ce que vous essayez de faire et quel est le problème avec votre code


Pourquoi ne pas juste faire cela avec une boucle simple?


Comment cette tâche est-elle une "somme"?


Vous pouvez simplifier cette boucle à juste résultat [i] = max - = éléments [i]; si cela ne vous dérange pas de muter max . Si vous devez quitter max seul, il suffit d'assigner à une variable temporelle avant la boucle et à l'utiliser à la place.


3 Réponses :


3
votes

Voici une instruction LINQ qui reproduira ce que vous avez fait dans vos commentaires xxx


2 commentaires

@ user3688343 Ce n'est pas un bon moyen de le faire. Lorsqu'un simple balayage via un iEnumerable suffit, vous numérisez dans la même liste de manière imbriquée, augmentant ainsi la complexité d'exécution par une commande et aggravant la lisibilité du code.


@ user3688343 vikhram est correct. Mais Vikhram n'a pas lu la question ... Cela a déclaré que vous vouliez une réponse de Linq et c'est ce que je vous ai donné ... alors arrêtez-vous sans lire M. Vikhram



2
votes

Malheureusement, LINQ ne fournit pas ce type d'agrégation. Idéalement, vous souhaitez écrire la fonction agrégée par vous-même pour cela, en utilisant des boucles. Une solution pas si propre à l'aide de Linq serait aussi ci-dessous

var results = items.AggregateExtn(max, (agg, curr) => agg - curr);


1 commentaires

LINQ n'est pas la bonne chose à utiliser dans cette situation. Malheureusement, je ne sais pas comment faire un agrégat ou comment cela fonctionnerait.



2
votes

Vous pouvez utiliser ce qui suit.

495 
488 
479 
478 


8 commentaires

sûrement la meilleure réponse xD


Le seul inconvénient est les effets secondaires qui veulent idéalement éviter avec Linq.


@JuHarr qui est?


@Neil, il change la variable max . Donc, si vous deviez itérer résultat deux fois, vous obtiendriez des résultats différents, sauf si vous réinitialisez max .


@juharr Merci d'avoir apporté ça. Mais, s'il a été converti en une matrice (comme je suis resté dans des commentaires) ou une liste, les résultats pourraient être conservés?


@juhararr ahh qui a du sens. vous avez raison. Mais vous pouvez simplement créer une nouvelle variable TEMP à la volée et stockez-la pour éviter cela.


@Neil qui résoudrait la variable modification variable, mais itération résultat aurait toujours le même problème que si vous réinitialisez la variable TEMP à max. La meilleure façon d'éviter que cela consiste à matérialiser la requête immédiatement via tolist ou toarray .


@Anuviswan Oui, je me matérialiserai certainement de toute requête LINQ avec des effets secondaires immédiatement pour cette raison même, mais vous perdez la charge paresseuse. C'est juste une question de choisir les offices que vous êtes prêt à vivre avec.