【发布时间】:2017-11-28 09:44:10
【问题描述】:
我试图实现允许比较 2 个列表的功能,如果两者中的值 (id) 相同,则第二个列表将覆盖第一个列表中的元素值,否则将添加第二个列表中的元素
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 更有效的方法?
【问题讨论】:
-
欢迎来到 Stack Overflow!您的代码目前似乎可以运行,并且您正在寻求改进它。一般来说,这些问题对于本网站来说过于固执己见,但您可能会在CodeReview.SE 找到更好的运气。记得阅读their requirements,因为他们比这个网站更严格。
-
您可以通过 PotionManager.Potion.Eff.id 创建一个 ISet(例如 HashSet)以使用
SomeSet.Contains(_eff.id)而不是effs.Find(x => x.id == _eff.id)来提高性能 -
您可以尝试使用 IEqualityComparer 接口,只需使用“Except”或“Intersect”方法进行所有比较并删除 foreach 请参阅相同的 MSDN 文档:msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx
标签: c# list linq compare ienumerable