2012-11-16 145 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