2017-11-11 5 views
3

Ich versuche, zwei Sammlungen zu schneiden. Ich habe zwei Listen in einem Code-Snippet aufgelistet.Zwei Sammlungen Kreuzung

Das ist mein Ausgang:

Intersection 
1 

Warum nur ein Wert gefunden wird? Ist es das erwartete Verhalten oder mache ich etwas falsch?

Ich erwarte, dass meine Ausgabe wie folgt aussieht:

Intersection 
1 
1 
1 
1 

Mein Code:

// Collection initialization 
List<int> list1 = new List<int> { 1,1,1,1 }; 
List<int> list2 = new List<int> { 1,1,1,1,1,1,1,1,1,1,1 }; 

foreach (int q in list1) 
    Console.WriteLine("list1: " + q); 

Console.WriteLine("------------------"); 

foreach (int q in list2) 
    Console.WriteLine("list2: " + q); 

Console.WriteLine("------------------"); 
Console.WriteLine("Intersection"); 

IEnumerable<int> both = list1.Intersect(list2); 

foreach (int a in both) 
    Console.WriteLine(a); 

Console.ReadLine(); 
Console.Clear(); 

Antwort

2

LINQ macht Ihre Arbeit einfacher. Verwenden Sie Contains Methode wie folgt:

List<int> resultList = list1.Where(c => list2.Contains(c)).ToList(); 

Nur nicht vergessen, LINQ zu Ihrer Verwendung von Richtlinien hinzufügen zuerst:

using System.Linq; 
+0

Dieser arbeitete genau so, wie ich es erwartet hatte! Ist es möglich, die gleiche Aktion mit DateTime durchzuführen? –

4

Wie Sie in der Beschreibung von Enumerable.Intersect lesen:

Der Schnittpunkt zweier Sätze A und B ist definiert als der Satz, der alle Elemente von A enthält, die auch in B erscheinen, aber keine anderen Elemente.

In einem set haben Sie nur unterschiedliche Objekte. Also ist es genauso wie wenn man nur 1 1 in ein Set setzt. Deshalb erhalten Sie nur einen Eintrag.

2

Intersect Rückgabe eindeutige übereinstimmende Elemente in beiden Listen