2016-04-21 27 views
3

Ich habe zwei Listen:Differenz von zwei Listen

List<string> list1 = new List<string>(); 
List<string> list2 = new List<string>(); 

list1 = {"a", "b", "b", "c", "b"}; 
list2 = {"b", "d", "c"}; 

Ich möchte die Unterschiede in der folgenden Art und Weise erhalten:

list3 = list1 - list2 = {"a", "b", "b"}; 
list4 = list2 - list1 = {"d"}; 

Ich kann nicht „Außer“ verwenden hier, weil

list1.Except(list2).ToList(); 

entfernt alle Vorkommen der Zeichenfolge "b" in list1. Ich brauche jeder Auftreten einer Zeichenfolge in der zweiten Liste entfernt nur eine Auftreten dieser Zeichenfolge in der ersten Liste.

Ich schätze Ihre Hilfe.

+0

'Operator overloading' –

+0

zu retten und die "b"' 'entfernt werden sollte? Erster zweiter Dritter? Oder Ergebnis Reihenfolge spielt keine Rolle? –

+0

spielt keine Rolle, welches "b" entfernt wird, die Reihenfolge der Elemente in den Listen ist völlig unwichtig – Jamshid33

Antwort

3

Versuchen Sie, diese

  List<string> list3 = list1; 
      foreach (string d in list2) { list3.Remove(d); } 
      List<string> list4 = list2; 
      foreach (string d in list1) { list4.Remove(d); } 
+1

Der Algorithmus ist korrekt, aber wahrscheinlich wollen Sie 'List list3 = neue Liste (list1);', sonst werden Elemente aus der ursprünglichen Liste entfernt, und es hat keinen Sinn, eine andere Variable zu verwenden (Sie können einfach aus 'entfernen list1' direkt) – Jcl

+0

Danke, funktionierte genau so, wie ich wollte! – Jamshid33

0
void Main() 
{ 
List<string> list1 = new List<string>(); 
List<string> list2 = new List<string>(); 

list1.Add("a"); 
list1.Add("b"); 
list1.Add("b"); 
list1.Add("c"); 
list1.Add("b"); 
list2.Add("b"); 
list2.Add("d"); 
list2.Add("c"); 

var resultList= temp(list2,list1); 
} 

List<string> temp(List<string> x,List<string> y) 
{ 
foreach(var value in y) 
{ 
    x.Remove((x.Where(z=>z == value).SelectMany(g=>g.Take(1).DefaultIfEmpty(g.First())).FirstOrDefault()).ToString()); 
} 
return x; 
} 
Verwandte Themen