我有以下類的兩個列表(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