比较对象列表

时间:2019-02-05 14:56:41

标签: c#

在某种情况下,我试图提出最佳解决方案(在注重性能的方法和太多的代码之间找到一个快乐的中介)。

出于所有意图和目的,集合内的对象类型为:

public class Foo
{
   public int Id { get; set; }
   public decimal Value { get; set; }
}

给出上述defaultCollection对象类型的2个集合(让它们分别称为specificCollectionFoo),我需要比较这些集合并最终得到{{1 }}:

  • 是两个集合中每个唯一条目的组合,但仅从Foo的{​​{1}}属性的角度来看是唯一的
  • 鉴于两个集合中具有匹配的Id的任何对象,我们应该以该特定对象的Foo版本结束

我开始着手将集合转换为Id的过程,其中specificCollectionDictionary<int, Foo>实例的int属性,并进行Key比较,但是我很快就结束了4个以上的Id循环,并决定这可能不是解决我的问题的好方法。我可以使用LINQ方法来解决此问题,以提供比我使用字典所走的路径更好的性能和更少的代码吗?

2 个答案:

答案 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列表包含以下内容

enter image description here