2015-01-14 108 views
1

我試圖找出列表中的重複值。找出列表中的重複值

但是,我的列表類型不是原始類型,我想知道列表中的哪些元素是重複的。

例如,我在List<Person>三「」類,,像下面的代碼。

我的過濾器是「Gender」Person類的屬性,目標結果應包含「Mary」和「Sandy」對象,因爲它們的性別值相同 - >女性。

Person Paul = new Person() { Name="Paul", Gender="male", Age="15"}; 
Person Mary = new Person() { Name = "Mary", Gender = "female", Age = "22" }; 
Person Sandy = new Person() { Name = "Sandy", Gender = "female", Age = "13" }; 

List<Person> people = new List<Person>(); 
people.Add(Paul); 
people.Add(Mary); 
people.Add(Sandy); 
+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

順便說一句,不要縮進你的純文本。縮進_code_四個空格,而不是文本 –

回答

2

使用GroupBy找到 「重複」,然後通過數限制:

var duplicates = people.GroupBy(p => p.Gender) 
         .Where (g => g.Count() >= 2); 

此時你可以列舉:

foreach (Person person in duplicates) 
{ 
    Console.WriteLine(person.Name); 
} 
1

看起來像你想分組 ,沒有發現重複。您可以使用LINQ GroupBy方法做到這一點:

people.GroupBy(p => p.Gender) 

這將返回一個IGrouping<string, Person>string作爲組關鍵類型。

類似的方法是使用一個查找

var peopleByGender = people.ToLookup(p => p.Gender); 
var females = peopleByGender["female"]; // An IEnumerable<Person> containing Mary and Sandy 

這將返回一個ILookup<string, Person>,這就像一個字典,除了相同的密鑰可以存在多次。

在附註上,您應該使用枚舉來表示性別。

+0

然後測試計數以查看該鍵在原始列表中是否有唯一對。那是你在想什麼的嗎? – TheNorthWes

+0

@AdmiralAdama是的,我應該說,但是我對OP的要求還是有點不清楚。 –

0
people.Where(p => p.Gender.Equals("female").ToList(); 

應該給你你想要

+0

這隻能處理一個案例。如果他不知道案件是什麼,他不能識別清楚或不清楚。 – TheNorthWes

+0

@Admiral:但是在複雜對象的情況下,您應該知道過濾數據的關鍵字。 –

+0

@PankajKapare更大的問題是,這不檢測是否有多個女性。這種情況是基於「女性」不止一次發生的,而不僅僅是一串。 – BradleyDotNET