2017-06-25 1 views
0

J'essayais d'implémenter une fonctionnalité qui permet de comparer 2 listes, et s'il y a une valeur identique (id) dans les deux, la deuxième liste recouvrira les valeurs des éléments dans la première liste, un élément autre de la deuxième liste seront ajoutésC# Linq ajouter des éléments d'une liste <custom> à un autre en les comparant et en changeant des valeurs

private List<PotionManager.Potion.Eff> effs = new List<PotionManager.Potion.Eff>(); 

public string id 
{ 
    set 
    { 
     var _effs = new List<PotionManager.Potion.Eff>(PM.GetEffectsOnPotion(value).Select(x => x.Clone())); 
     foreach (PotionManager.Potion.Eff _eff in _effs) 
     { 
      var eff = effs.Find(x => x.id == _eff.id); 
      if (eff != null) 
      { 
       eff.power = _eff.power; 
       eff.time = _eff.time; 
      } 
      else 
      { 
       effs.Add(_eff); 
      } 
     } 
    } 
} 

est-il un moyen plus efficace au lieu de le faire foreach?

+1

Bienvenue dans Stack Overflow! Il semble que votre code fonctionne actuellement, et vous cherchez à l'améliorer. Généralement, ces questions sont trop controversées pour ce site, mais vous pourriez trouver plus de chance à [CodeReview.SE] (// codereview.stackexchange.com/tour). N'oubliez pas de lire [leurs exigences] (// codereview.stackexchange.com/help/on-topic) car ils sont un peu plus strictes que ce site. – FrankerZ

+0

Vous pouvez créer un ISet (par exemple HashSet) par PotionManager.Potion.Eff.id pour améliorer les performances en utilisant 'SomeSet.Contains (_eff.id)' au lieu de 'effs.Find (x => x.id == _eff. id) ' –

+0

Vous pouvez essayer d'utiliser l'interface IEqualityComparer et simplement utiliser les méthodes" Sauf "ou" Intersection "pour faire toutes vos comparaisons et supprimer le foreach s'il vous plaît se référer au document MSDN sur le même: https://msdn.microsoft. com/fr-fr/library/ms132151 (v = vs.110) .aspx –

Répondre

0

essayez ceci:

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class UserComparer : IEqualityComparer<User> 
{ 
    public bool Equals(User x, User y) => x.Id == y.Id; 
    public int GetHashCode(User obj) => base.GetHashCode(); 
} 

dans la méthode principale:

var list1 = new List<User> 
    { 
     new User{Id = 1, Name = "Ted" }, 
     new User{Id = 2, Name = "Jhon" }, 
     new User{Id = 3, Name = "Alex" } 
    }; 
var list2 = new List<User> 
    { 
     new User{Id = 2, Name = "Jhon" }, 
     new User{Id = 3, Name = "Alex" }, 
     new User{Id = 4, Name = "Sam" }, 
    }; 

var result = list1.Union(list2, new UserComparer()); 

le résultat de 4 éléments: 1 Ted, 2 Jhon, 3 Alex, 4 Sam

J'espère cela vous aide