2014-11-05 69 views
0

我有兩個相同對象的列表,我想基於不區分大小寫的方式查找這些列表的聯合和交集對象屬性的比較。如何在linq中以不區分大小寫的方式比較字符串,它們是對象的屬性

爲簡單起見,我們將其稱爲Person,並且我想過濾Person.Name屬性。

這樣做的建議方法是什麼?我希望將代碼保存在Linq的一行中。

目前我做了以下內容:

public class Person { public string Name { get; set; } } 

-

var people = 
    firstListOfPeople.Where(
     p1 => p1.Name != null && 
      secondListOfPeople 
       .Where(p2 => p2.Name != null) 
       .Select(p2 => p2.Name.ToUpper()) 
       .Contains(p1.Name.ToUpper())); 
+1

看起來'Select.Contains'有點超過頂部;但否則代碼似乎是合理的。該代碼是否會導致問題? – BradleyDotNET 2014-11-05 00:06:48

+0

對於等於 - http://stackoverflow.com/questions/3121957/how-can-i-do-a-case-insensitive-string-comparison,爲包含 - IndexOf:http://stackoverflow.com/questions/444798/case-insensitive-containsstring ...不能使兩者都重複:) – 2014-11-05 00:06:59

+0

@BradleyDotNET不,代碼有效。只是希望更簡單一些(即使這意味着擴展Person類),如:'firstListOfPeople.Intersect(secondListOfPeople)' – 2014-11-05 00:08:57

回答

1

我認爲@BradleyDotNET有正確的答案,但因爲我已經有一個例子大多是完整的,我想我會張貼在情況下,它可以幫助某人在路上:

void Main() 
{ 
    var firstListOfPeople = new[] 
    { 
     new Person { Name = "Rufus" }, 
     new Person { Name = "Bob" }, 
     new Person { Name = "steve" }, 
    }; 

    var secondListOfPeople = new[] 
    { 
     new Person { Name = "john" }, 
     new Person { Name = "Bob" }, 
     new Person { Name = "rufus" }, 
    }; 

    var people = firstListOfPeople.Intersect(secondListOfPeople, new PersonNameComparer()); 

    people.Dump(); // displays the result if you are using LINQPad 
} 

public class Person 
{ 
    public string Name { get; set; } 
} 

public class PersonNameComparer: EqualityComparer<Person> 
{ 

    public override bool Equals(Person p1, Person p2) 
    { 
     return p1.Name.Equals(p2.Name, StringComparison.OrdinalIgnoreCase); 
    } 

    public override int GetHashCode(Person p) 
    { 
     return p.Name.ToLower().GetHashCode(); 
    } 
} 
4

您可以向下塌陷您的代碼如下:

firstListOfPeople.Intersect(secondListOfPeople); 

漁獲自帶的病例對名稱不敏感的比較。 Intersect使用默認的相等比較器(引用相等),所以您需要實現IEqualityComparer<T>MSDN)。

該比較可以進行基於名稱的比較。然後,您可以創建一個並把它傳遞給Intersect正確的過載:http://msdn.microsoft.com/en-us/library/vstudio/bb355408(v=vs.100).aspx

firstListOfPeople.Instersect(secondListOfPeople, myComparer); 
+0

太棒了,我認爲這是正確的道路。不幸的是,這個類已經有一個自定義的比較器,它比我所需要的要多(它做了更深入的比較,例如'Age'屬性也是如此)。但這聽起來像我可以通過一個不同的。讓我試試看。 – 2014-11-05 00:16:15

+0

@PeterDuniho,你可以使用'Comparer '作爲'Intersect()'嗎?我不認爲'Comparer '是'IEqualityComparer ',因此它不匹配'Intersect()'的簽名(第二次重載)。 – devuxer 2014-11-05 01:09:28

+0

@devuxer:你是對的,我忘了'Comparer '只實現'IComparer ',而不是'IEqualityComparer '(事後看來,它是完全沒有意義的)。沒有散​​列碼的實現,這裏沒有用。 (但在我看來,.NET應該有一個'EqualityComparer .Create()'方法:))。 – 2014-11-05 01:22:21

相關問題