2016-08-17 54 views
-1

刪除的元素我有查找添加和2所列出

var list1 = new List<int> { 1, 2, 3 }; 
var list2 = new List<int> { 1, 2, 4 }; 

我想從這個:

listAdded: {4} 
listRemoved: {2} 

元素是不同的。

我怎能:

*Quickly find if list1 and list2 are the same (no changes) 
*Get the list of changes (added & removed)? 

我目前使用List<T>,但我願意HashSet<T>如果它會使事情更快。

+3

https://www.google.com/#safe=active&q=.net%20find%20difference%20between%20two%20lists –

+0

'*快速查找list1和list2是否相同(無變化)':將兩者都排序列表和for循環其中之一,並檢查值匹配的相同位置 –

+0

可以顯示實際的C#代碼關於你有什麼..?還添加到特定位置的列表以及從特定位置的列表中刪除項目並不困難做一些谷歌搜索關鍵詞RemoveAt – MethodMan

回答

2

僅僅通過使用除了您可以獲得新集合中兩個列表之間的差異之外,您還可以檢查新集合的計數以查看它們是否有任何差異。

var removed = list1.Except(list2).ToList(); 
var added = list2.Except(list1).ToList(); 

然後,你可以自由地做一個簡單的,如果對他們的計數:

bool areDifferent = removed.Count > 0 || added.Count > 0; 

或凱文·建議:

bool areDifferent = removed.Any() || added.Any(); 
+0

的問題不應該是bool areDifferent = removed.Count()> 0 || added.Count()> 0;或者你可以使用removed.Any()||所有() – Kevin

+0

@Kevin當然我很着急! – meJustAndrew

0

僞代碼使用LINQ - (刪除 - 見@ meJustAndrew的答案更好的LINQ實現)

如果列表進行排序,您可以做一些O(N):

int i = 0; 
int j = 0; 

while(i < list1.Count && j < list2.Count) 
{ 
    if (list1[i] == list2[j]) 
    { 
    ++i; 
    ++j; 
    } 
    else if (list1[i] < list2[j]) 
    { 
    removed.Add(list1[i]); 
    ++i; 
    } 
    else // if (list1[i] > list2[j]) 
    { 
    added.Add(list2[j]); 
    ++j; 
    } 
} 

if (i < list1.Count) 
{ 
    removed.AddRange(list1.GetRange(i,list1.Count)); 
} 
if (j < list2.Count) 
{ 
    added.AddRange(list2.GetRange(j,list2.Count)); 
} 
0

您可以從列表<派生的類>並重寫Add()和Remove()。

Public class MyList<T> : List<T> 
{ 

    private List<T> oldItems = new List<T>(); 
    private List<T> newItems = new List<T>(); 

    private List<T> items = new List<T>(); 
    public List<T> Items 
    { 
     get { return items; } 
     set { items = value; } 
    } 

    public void Add(T value) 
    { 
     Items.Add(value); 
     newItems.Add(Items.Where(w=>w==value)); // must be the object in the "Items" list 
    } 

    public void Remove(T value) 
    { 
     Items.Remove(value); 
     oldItems.Add(value); //value does not exist anymore in `Items` 
    } 

    public List<T> GetOldItems() 
    { 
     List<T> oldi = oldItems; 
     oldItems.Clear(); 
     return oldi; 
    } 

    public List<T> GetNewItems() // 
    { 
     List<T> newi = newItems; 
     newItems.Clear(); 
     return newi; 
    } 
} 

然後,您有一個列表,其中包含舊項目和新項目的列表。

添加項目時,即使刪除項目,也會進行註冊。 當你得到新的或舊的項目時,寄存器將被清除。