2012-08-29 29 views
2

我有一個用戶列表下面給出:C#拉姆達得到的值不同列表有條件

List<User> users = new List<User>(); 

users.Add(new User(){ UserId = "11", City = "London" }); 
users.Add(new User(){ UserId = "12", City = "London" }); 
users.Add(new User(){ UserId = "12", City = "London" }); 
users.Add(new User(){ UserId = "11", City = "Newyork" }); 
users.Add(new User(){ UserId = "14", City = "Virginia" }); 

在這裏,我想不同的用戶ID那些C# lambda expression

有不同的市所以,在上面的情況下,我應該得到一個只包含UserId = 11項目的List<string>,因爲UserId是相同的,但城市對於這兩個項目都是不同的。

能否讓我知道我將如何通過C#lambda代碼來實現這一點。

在此先感謝。

+4

[你嘗試過什麼?](http://whathaveyoutried.com) – SynerCoder

+0

@SynerCoder我試圖根據groupby拉姆達條款,但沒有成功。 – nunu

+0

@nunu:請顯示您的代碼。 –

回答

8

喜歡的東西:

var result = users.GroupBy(u => u.UserId) 
        .Where(g => g.Select(u => u.City).Distinct().Count() > 1) 
        .Select(g => g.Key) 
        .ToList(); 

應該這樣做。

它需要{UserId,City}對並將其轉換爲由UserId索引的那些對的組;然後查找組中有多個城市的情況。最後從小組中獲取結果的關鍵。

+0

完美!謝謝.. – nunu

+0

嗨理查德...現在我想獲得反向場景......我只想選擇那些擁有單個或多個SIMILAR城市的用戶ID ...請告訴我該怎麼做?提前致謝! – nunu

+1

@nunu對於單個城市,將'> 1'條件更改爲'== 1'。對於*類似*,您需要將「Distinct」替換爲與您所指類似內容(可能是自定義['IEqualityComparer '](http://msdn.microsoft.com/en-us /library/bb338049.aspx)傳遞給'Enumerable.Distinct'重載)。如果沒有類似的具體定義,它就更加具體而言含糊不清。 – Richard

1
from u in users group u.City by u.UserId into grp //group on the id 
where grp.Distinct().Count() > 1 // we only want those with more than one distinct city 
select grp.Key //we want the key 
+0

你的答案絕對完美!只是不同的是Lambda和LINQ :)我upvoted太.. – nunu

0
var list = users.GroupBy(Obj=>new {Obj.UserID,Obj.City}).Distinct();