2017-06-25 49 views
0

我试图实现的功能,允许2个列表进行比较,如果在两个有相同的值(id),第二个列表将覆盖元素值在第一个列表,从第二个列表中其他元素将被添加C#Linq添加元素从一个列表<custom>到另一个比较他们和改变值

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); 
      } 
     } 
    } 
} 

有没有更有效的方法这样做的,而不是的foreach?

+1

欢迎来到堆栈溢出!看起来你的代码目前有效,你正在寻求改进它。一般来说,这些问题对于这个网站来说太过分了,但是你可能会在[CodeReview.SE](// codereview.stackexchange.com/tour)找到更好的运气。请记住阅读[他们的要求](// codereview.stackexchange.com/help/on-topic),因为它们比本网站更严格。 – FrankerZ

+0

您可以使用'SomeSet.Contains(_eff.id)'而不是'effs.Find(x => x.id == _eff)通过PotionManager.Potion.Eff.id创建一个ISet(例如HashSet) id)' –

+0

您可以尝试使用IEqualityComparer接口,只需使用“Except”或“Intersect”方法进行所有比较并删除该文件即可。请参阅MSDN文档:https://msdn.microsoft。 COM/EN-US /库/ ms132151(v = vs.110)的.aspx –

回答

0

试试这个:

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()); 

结果将包含4个元素: 1泰德,2 JHON,3亚历克斯,4山姆

我希望

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(); 
} 
的主要方法

这可以帮助你

相关问题