J'ai deux listes d'objets personnalisés et je souhaite mettre à jour un champ pour tous les objets d'une liste s'il y a un objet dans l'autre liste qui correspond à une autre paire de champs.Meilleure performance lors de la mise à jour des objets avec linq
Ce code explique mieux le problème et produit les résultats que je veux. Cependant, pour les listes plus grandes 20k, et une liste de 20k avec des objets correspondants, cela prend un temps considérable (31s). Je peux améliorer cela avec ~ 50% en utilisant la méthode Find (Predicate) des listes génériques.
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
namespace ExperimentFW3
{
public class PropValue
{
public string Name;
public decimal Val;
public decimal Total;
}
public class Adjustment
{
public string PropName;
public decimal AdjVal;
}
class Program
{
static List<PropValue> propList;
static List<Adjustment> adjList;
public static void Main()
{
propList = new List<PropValue>{
new PropValue{Name = "Alfa", Val=2.1M},
new PropValue{Name = "Beta", Val=1.0M},
new PropValue{Name = "Gamma", Val=8.0M}
};
adjList = new List<Adjustment>{
new Adjustment{PropName = "Alfa", AdjVal=-0.1M},
new Adjustment{PropName = "Beta", AdjVal=3M}
};
foreach (var p in propList)
{
Adjustment a = adjList.SingleOrDefault(
av => av.PropName.Equals(p.Name)
);
if (a != null)
p.Total = p.Val + a.AdjVal;
else
p.Total = p.Val;
}
}
}
}
Le résultat souhaité est: Alfa total = 2, total = 4, Gamma total = 8
Mais Beta je me demande si cela est possible de faire encore plus vite. Inner joignant les deux listes prend très peu de temps, même lors de la boucle de plus de 20k éléments dans le jeu de résultats. Donc, ma question est de savoir s'il est possible de faire quelque chose comme je le ferais avec T-SQL? Une UPDATE d'une jointure gauche utilisant ISNULL (val, 0) sur la valeur d'ajustement.
Merci pour une réponse rapide! J'ai récemment commencé à regarder linq et j'ai été pris en train d'essayer d'émuler t-sql dans le code. Votre code non testé mesure en ms, j'ai donc eu le coup de pouce de performance que j'ai demandé. – mnsc
Heureux que cela a aidé ... bien que je ne sois pas sûr pourquoi cette Q & A est maintenant un wiki de la communauté :( –
Il y a une case à cocher "community wiki" lors de la publication Parfois elle est activée même si vous n'avez jamais cliqué dessus –