我有以下类的两个列表(ObservableCollections):如何合并两个列表?
public class Data
{
public string Key { get; set; }
public string Value { get; set; }
}
一个较旧的对象(listA
)和第二代表更新的人(listB
)。我想合并来自listB
的新数据到listA
而不会打破任何引用。更确切地说我要做到以下几点:
- 从
listA
删除不listB
存在的所有对象(对象由Key
财产相比) - 添加到
listA
所有对象从listB
不中listA
存在 - 更新
Value
属性在listA
存在于两个列表中的所有对象
你能否提出一些有效的方法来做到这一点?我的解决方案很大,看起来非常无效。
更新: 目前的解决方案是:
public void MergeInstanceList(List<Instance> instances)
{
var dicOld = Instances.ToDictionary(a => a.Ip);
var dicNew = instances.ToDictionary(a => a.Ip);
var forUpdate = instances.Intersect(Instances, new Comparer()).ToList();
Instances.Where(a => !dicNew.Keys.Contains(a.Ip)).ToList().ForEach(a => Instances.Remove(a));
instances.Where(a => !dicOld.Keys.Contains(a.Ip)).ToList().ForEach(a => Instances.Add(a));
forUpdate.ForEach(a => dicOld[a.Ip].Name = a.Name);
}
public class Comparer : IEqualityComparer<Instance>
{
public bool Equals(Instance x, Instance y)
{
return x.Ip == y.Ip;
}
public int GetHashCode(Instance obj)
{
return obj.Ip.GetHashCode();
}
}
你能显示您当前的解决方案,使我们可以看到它是如何被imprved? – 2012-08-16 15:14:50
我不知道你的藏品有多大,但(一般),那岂不是更容易改写这样的问题:从数组listB获取所有项目(当前的)和追加的项目listA的在数组listB不存在(的那些没有更新)。在这种情况下,'var listC = listB.Union(listA);'与自定义'IEqualityComparer'应该是OK ... – 2012-08-16 15:20:35
那么我的数据类实际上更复杂。我将删除一些不需要的代码并在5分钟内发布。 //完成。 – Poma 2012-08-16 15:20:53