我有listA
,listB
。 listA
是listB
的子集。例如,删除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
循环吗?
答案 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
此外,可观察的集合允许您检测集合中发生的事件类型。 (即添加,删除,替换等)这可以帮助您在使用相同信息更新其他列表的过程中。