基于更新更新列表发生在其他列表中

时间:2012-11-16 13:53:40

标签: c# collections

我有listAlistBlistAlistB的子集。例如,删除1个元素,并将2个元素添加到listB。然后,如果listA包含从listB中删除的元素,请将其从listA中删除。此外,listA应添加新添加的元素。

目前我使用foreach{ if(list.contains) }两次。一次添加和删除一次。这将是O(2n),这没关系。

但有没有一种最好的方法来实现这一点,主要是使用LINQ中的O(n)/任何其他方式?

更清楚:
其实我有一个自定义类列表 我在上面的问题中形成listA(使用其中的一个字段)。 ListB只是我从Web服务获得的字符串列表。 代码:

//First foreach loop which I was taking about.

foreach (string A in listA)
{
  if (listB.Contains(A)
   {
   }
  else
   {
      //getting items that are added to listB
   } 
}  

//Second foreach loop which i was taking about.

foreach (string A in listB)
{
  if (listA.Contains(A)
   {
   }
  else
   {
      //getting items that are deleted from listB
   } 
}   

然后我相应地更新了List<custom class>。我的主要问题是,我可以做更好的事情而不是使用两个foreach循环吗?

3 个答案:

答案 0 :(得分:1)

这可能更有效(虽然这取决于):

var notInA = listB.Except(listA).ToList();
var notInB = listA.Except(listB).ToList();
foreach (var a in notInA)
    listA.Add(a);
foreach (var b in notInB)
    listA.Remove(b);

请注意,如果IEqualityComparer<T>是自定义类,则需要实现自定义T

编辑:所以这只是同步两个列表。也许我误解了这个问题但你不能简单地说:

listA = new List<T>(listB);

答案 1 :(得分:0)

您可以使用事件/代理而不是foreach吗?阅读讨论here

答案 2 :(得分:0)

您应该能够观察这些列表。更新一个列表时,触发CollectionChanged事件,并添加一些代码以更新其他列表。你应该能够做到这两点。请参见Observable Collections:Here

此外,可观察的集合允许您检测集合中发生的事件类型。 (即添加,删除,替换等)这可以帮助您在使用相同信息更新其他列表的过程中。