2016-08-17 3 views
-1

Ich habeaus 2 Listen

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

ich von dieser wollen:

listAdded: {4} 
listRemoved: {2} 

Die Elemente verschieden sind.

Wie kann ich:

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

ich derzeit List<T> bin mit aber ich bin offen für HashSet<T> wenn es Dinge schneller machen.

+3

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

+0

'* Schnell finden Sie, ob list1 und list2 gleich sind (keine Änderungen)': Sortieren Sie beide Listen und für eine Schleife auf einer von ihnen und überprüfen, dass die Werte für die gleiche Position übereinstimmen –

+0

können Sie tatsächlichen C# -Code in Bezug auf was Sie haben ..? auch das Hinzufügen zu einer Liste an einem bestimmten Ort sowie das Entfernen von Elementen aus einer Liste an einem bestimmten Ort sind nicht so schwierig, einige google suchen auf das Schlüsselwort 'RemoveAt' – MethodMan

Antwort

2

einfach durch Mit Ausnahme der Unterschiede zwischen zwei Listen in einer neuen Sammlung können Sie die Anzahl der neuen Sammlungen überprüfen, um festzustellen, ob sie Unterschiede aufweisen.

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

Dann sind Sie frei, eine einfach zu tun, wenn sie auf ihre Count:

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

oder als Kevin vorgeschlagen:

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

Sollte das nicht bool sein areDifferent = removed.Count()> 0 || added.Count()> 0; oder Sie könnten removed.Any() || verwenden added.Any() – Kevin

+0

@Kevin Ich hatte es eilig, natürlich! – meJustAndrew

0

Pseudocode mit LINQ - (entfernt - siehe @ meJustAndrew Antwort für eine bessere LINQ Implementierung)

Sie etwas O tun könnte (n), wenn die Listen sortiert werden:

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

Sie können eine Klasse machen, die aus Liste leitet <> Überschreiben Sie Add() und 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; 
    } 
} 

Dann haben Sie eine Liste mit einer Liste für alte und neue Artikel.

Wenn Sie ein Objekt hinzufügen, wird es auch dann registriert, wenn Sie ein Objekt entfernen. Wenn Sie die neuen oder alten Artikel erhalten, wird das Register gelöscht.