2012-11-16 108 views
1

我有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循环,我可以做些更好的事情吗?

+1

你能发布一个真实的代码片段吗? – LightStriker

+0

已更新的问题与可能的代码段 – Sai

回答

0

您可以使用events/delegates而不是foreach吗?阅读讨论here

+0

@ AYK-No我不能使用它们,因为我从服务获得第二个列表。 – Sai

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); 
+0

我正在做类似于你所建议的事情,但我喜欢你所做的。你可以从更新的问题中看到,我不能使用listA = new List (listB); 而不是使用两个foreach块我可以做更好的事情吗?任何帮助? – Sai

0

你应该能够使这些列表可观察。当更新一个列表时,触发CollectionChanged事件,并添加一些代码来更新您的其他列表。你应该能够做到这一点。请参阅可观察集合:Here

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

+1

我从服务中获得第二个清单。为了更清楚我更新了我的问题。感谢您的输入 – Sai