2016-06-27 15 views
-1

ich die folgende Klasse haben:Vergleichen Produkte in allen Positionen der Liste

public class Person { 
    public String Name { get; set; } 
    public Int32 Age { get; set; } 
} 

Und ich habe zwei Listen von Person:

List<Person> a = service.GetPersons("a"); 
List<Person> b = service.GetPersons("b"); 

Die Listen haben die gleiche Größe. Ist es möglich, mit einem Lambda-Ausdruck zu prüfen, ob für die gleiche Position die Person denselben Namen und dasselbe Alter in den beiden Listen hat? Ich möchte alle Positionen einchecken.

+0

Nur um klar zu stellen, wollen Sie diese Antwort ausschließlich im Format der Verwendung eines Lambda-Ausdruckes richtig? Oder kann es eine andere Lösung sein? – dvsoukup

Antwort

6

Sie können es mit SequenceEqual und einem benutzerdefinierten Vergleich, wie folgt aus:

var personCmp = new PersonComparer(); 
var same = a.SequenceEqual(b, personCmp); 
... 
class PersonComparer : IEqualityComparer<Person> { 
    public bool Equals(Person p1, Person p2) { 
     return p1.Name==p2.Name && p1.Age == p2.Age; 
    } 
    public int GetHashCode(Person p) { 
     return p.Name.GetHashCode()*31 + p.Age; 
    } 
} 
5

können Sie Zip() verwenden, um dies zu lösen:

var equals = a.Zip(b, (xa, xb) => new Tuple<Person, Person>(xa, xb)) 
       .All(t => 
         t.Item1.Name == t.Item2.Name && 
         t.Item1.Age == t.Item2.Age); 

Beachten Sie, dass dies nur richtig sein, wenn die beiden Listen wirklich die gleiche Größe haben.

+0

Dieser Code wird nicht kompiliert! –

+0

@ S.Akbari thx, fügte die fehlende Klammer hinzu und entfernte die Superflüssigkeiten. –

+0

@ IvanStoev das ist richtig, aber OP erklärte explizit, dass die Listen von gleicher Größe sind. –

0

Dieser Code nicht kompiliert oder getestet ...

Sie nach Duplikaten wie folgt aussehen:

// With same index in list... 

for(int i=0;i<a.Count;i++) 
{ 
    if(a[i].Name == b[i].Name) 
    { 
     // do something 
    } 
} 


// check each index in list a against every item in list b 
List<Person> duplicates = a.Where(person_A => b.Any(person_B => person_A.Name === person_B.Name)).ToList(); 


// check by index using lambda... 
List<Person> duplicates = a.Where(person_A, index => b[index].Name == person_A.Name).ToList(); 
Verwandte Themen