5 votes

AddRange() et problème de copie LINQ

J'ai actuellement une méthode qui est assez simple et qui calcule une liste de CurveValue (objet personnalisé), le problème que j'ai est que je dois calculer le paramètre et passer une décimale en retour sans réellement changer le paramètre.

J'ai essayé d'ajouter AddRange() à un nouvel objet pour que la courbe du paramètre ne soit pas affectée, mais il semble que la référence existe toujours et qu'après l'exécution de ForEach(), la courbe et la courbe A aient changé.

Je suppose qu'il est toujours référencé, mais existe-t-il un moyen simple de le faire sans énumérer la courbe des paramètres et l'ajouter à la courbe A ?

public decimal Multiply(List<CurveValue> curve, decimal dVal)
{
    List<CurveValue> curveA = new List<CurveValue>();
    curveA.AddRange(curve);

    curveA.ForEach(a => a.Value = decimal.Round(a.Value, 4) * dVal);

    return Sum(curveA);
}

public decimal Sum(List<CurveValue> curveA)
{
    return curveA.Sum(x => x.Value);
}

6voto

rich.okelly Points 24144

Vous pouvez simplement utiliser la méthode Sum comme ça :

public decimal Multiply(IEnumerable<CurveValue> curve, decimal dVal)
{
    return curve.Sum(a => decimal.Round(a.Value, 4) * dVal);
}

Mise à jour

Fournir une autre implémentation qui passe par la méthode Sum existante :

public decimal Multiply(IEnumerable<CurveValue> curve, decimal dVal)
{
    IEnumerable<CurveValue> curveA = curve.Select(c => new Curve { Value = decimal.Round(c.Value, 4) * dVal });
    return Sum(curveA);
}

public decimal Sum(IEnumerable<CurveValue> curveA)
{
    return curveA.Sum(x => x.Value);
}

3voto

Rodrigo Vedovato Points 543

Comme vous utilisez une collection List, vous pouvez utiliser la méthode d'extension Select. Cette méthode fournit un paramètre où vous définissez une fonction de transformation pour chaque élément de votre liste et renvoie un IEnumerable où T est le type que vous spécifiez sur votre fonction.

J'espère que cela vous aidera :)

3voto

Lindan Points 110

C'est peut-être un peu vieux jeu, mais pourquoi copier la gamme ?

Vous pourriez simplement itérer sur la courbe, et mettre la valeur calculée dans une liste de résultats, puis additionner les valeurs.

List<CurveValue> curveA = new List<CurveValue>();        
curve.ForEach(a => curveA.Add(new CurveValue {Value = decimal.Round(a.Value, 4) * dVal });          

return Sum(curveA); 

Désolé de ne pas avoir vérifié le code, je suis sur mon netbook. J'espère que vous comprenez ce que je veux dire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X