在某种情况下,我试图提出最佳解决方案(在注重性能的方法和太多的代码之间找到一个快乐的中介)。
出于所有意图和目的,集合内的对象类型为:
public class Foo
{
public int Id { get; set; }
public decimal Value { get; set; }
}
给出上述defaultCollection
对象类型的2个集合(让它们分别称为specificCollection
和Foo
),我需要比较这些集合并最终得到{{1 }}:
Foo
的{{1}}属性的角度来看是唯一的Id
的任何对象,我们应该以该特定对象的Foo
版本结束我开始着手将集合转换为Id
的过程,其中specificCollection
是Dictionary<int, Foo>
实例的int
属性,并进行Key比较,但是我很快就结束了4个以上的Id
循环,并决定这可能不是解决我的问题的好方法。我可以使用LINQ方法来解决此问题,以提供比我使用字典所走的路径更好的性能和更少的代码吗?
答案 0 :(得分:2)
Try this code. It will add to result
all items from specificCollection
. Then for each item in defaultCollection
it will check whether or not that Id
already added. And if this is a new Id, item will be added to result
:
var defaultCollection = ...
var specificCollection = ...
var result = new List<Foo>();
result.AddRange(specificCollection);
var addedIds = new HashSet<int>();
foreach (var foo in specificCollection)
addedIds.Add(foo.Id);
result.AddRange(defaultCollection.Where(f => !addedIds.Contains(f.Id)));
答案 1 :(得分:1)
您可以使用AddRange
函数来实现此目的,如前所述。
var dc = new List<Foo> { new Foo { Id = 1, Value = 1 }, new Foo { Id = 2, Value = 2 } };
var sc = new List<Foo> { new Foo { Id = 3, Value = 33 }, new Foo {Id = 2, Value = 22} };
var nc = new List<Foo>();
nc.AddRange(sc);
nc.AddRange(dc.Where(c => sc.All(s => s.Id != c.Id)));
现在nc
列表包含以下内容