2016-07-19 11 views
0

Ich versuche, zwei Listen mit Linq oder Lambda-Ausdruck zu vergleichen. Ich möchte keine Art von Schleifen verwenden.Wie vergleicht man einen Listentyp von Objekt mit Listentyp Int

wenn ich beide des Listentypen ganzzahliger habe, würde ich diesen Ausdruck verwendet

Beispiel 1

List<int> tlistA = new List<int>(); 
tlistA.AddRange(new int[] { 1, 2, 3, 4, 5 }); 

List<int> tlistB = new List<int>(); 
tlistB.AddRange(new int[] { 3, 5, 6, 7, 8 }); 


    Console.WriteLine((from tla in tlistA 
         where tlistB.Contains(tla) 
         select tla).Any()); 

Wenn ich jedoch beide der Liste Art des Gegenstandes habe, würde diese Einstellung sinn

Ausdruck

Beispiel 2

class la{public int v { get; set; }} 
    class lb{public int v { get; set; }} 

    static void Main(string[] args) 
    { 
     List<la> listA = new List<la> 
     { 
      new la() { v = 1 }, 
      new la() { v = 2 }, 
      new la() { v = 3 }, 
      new la() { v = 4 }, 
      new la() { v = 5 }, 
     }; 
     List<lb> listB = new List<lb> 
     { 
      new lb() { v = 3 }, 
      new lb() { v = 5 }, 
      new lb() { v = 6 }, 
      new lb() { v = 7 }, 
      new lb() { v = 8 }, 
     }; 


     Console.WriteLine(listB 
      .Where(b => 
      listA 
      .Any(a => a.v == b.v)) 
      .Any()); 
    } 

Aber meine Frage ist, wie ich w Es sollte ein List-Typ von Integer mit einem anderen List-Typ von Objekt verglichen werden, das eine Integer-Eigenschaft hat.

um meine Frage klar zu machen "Wie würde ich TlistA von Beispiel 1 mit ListB von Beispiel 2 vergleichen?"

Dank viel

+2

warum spielt es keine Rolle, ob Sie eine beliebige Form einer Schleife verwenden Contains -Ansatz -

So könnten Sie auch Ihre (langsam) Where verwenden. Es kann nicht vernünftig sein, zu erwarten, dass man zwei Listen vergleichen kann, ohne sie einzeln aufzählen zu können (was eine Schleife erfordert, selbst wenn sie mit Hilfe von linq abstrahiert wird). können Sie auch definieren, was es bedeutet, zwei Listen zu vergleichen? was genau vergleichen Sie und was erwarten Sie als Antwort? –

Antwort

3

Der effizienteste Ansatz ist nicht Where + Contains + Any aber Intersect + Any:

bool intsContainV = tlistA.Intersect(listB.Select(b => b.v)).Any(); 

Der Schlüssel ist, dass Sie die int Eigenschaft von den Objekten wählen haben es in Intersect zu verwenden.

bool intsContainV = tlistA 
    .Where(i => listB.Select(b => b.v).Contains(i)) 
    .Any(); 

oder kürzer:

bool intsContainV = tlistA.Any(i => listB.Select(b => b.v).Contains(i)); 
1
tlistA.Where(x => listB.Select(y => y.v).Contains(x)).Any(); 

oder

tListA.Intersect(listB.Select(y => y.v)).Any(); 

Im Wesentlichen müssen Sie ListB in eine ganze Liste drehen und diese durch ListB.Select(y => y.v) getan wird, sobald es eine ganze Liste ist, dass Sie frei vergleichen Ihre Integer-Liste mit der von Ihnen gewünschten Methode.

Verwandte Themen