2016-06-27 156 views
-1

的所有位置的項目我有下面的類:比較列表

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

而且我的人兩個列表:

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

的列表具有相同的大小。是否有可能使用Lambda表達式來檢查人員在兩個列表中是否具有相同的姓名和年齡?我想檢查所有位置。

+0

爲了澄清,您希望嚴格按照使用Lambda表達式的格式正確回答此問題?或者它可以是其他解決方案嗎? – dvsoukup

回答

6

您可以SequenceEqual和一個自定義的比較做,像這樣:

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

您可以使用Zip()來解決這個問題:

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); 

請注意,這隻會是正確的,如果兩個列表真的具有相同的大小。

+0

這段代碼不會編譯! –

+0

@ S.Akbari thx,添加了缺失的括號並刪除了超級隊列。 –

+0

@IvanStoev,這是正確的,但OP明確指出,這些名單是相同的大小。 –

0

此代碼不編譯或測試...

你可以尋找受騙者這樣的:

// 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();