1

我有listAlistBlistA是 的子集listB。例如,删除 1 个元素并添加 2 个元素listB。然后如果listA包含从 listB 中删除的元素,则将其从 中删除listA。另外,listA应该添加新添加的元素。

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

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

更清楚地说:
实际上我有一个自定义类的列表。
listA在上述问题中形成的(使用其中一个领域)。ListB只是我从网络服务获得的字符串列表。代码:

//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循环之外,我还能做得更好吗?

4

3 回答 3

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);
于 2012-11-16T14:09:11.630 回答
0

您应该能够使这些列表可观察。当一个列表更新时,触发 CollectionChanged 事件,并添加一些代码来更新您的另一个列表。你应该能够做到这两种方式。查看可观察的集合:这里

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

于 2012-11-16T14:51:54.973 回答
0

您可以使用事件/委托代替 foreach 吗?在此处阅读讨论

于 2012-11-16T14:00:33.627 回答