2017-02-10 82 views
4

我認爲這本來很簡單,但不幸的是我無法找到我正在尋找的答案。 我想實現的是,如果它們被複制,則返回一個獨特結果列表,否則返回0而不是單數項。 代碼我有多遠,其中第一個不同的應該返回所有不同行,然後第二個過濾它們進一步下跌:如果從DistinctBy發現沒有重複項,則返回0

List<Server> serversWithBothAffinity = filteredServers 
    .DistinctBy(x => new { x.ServerVersion, x.ServerName, x.ServerSlot, x.ServerAffinity}) 
    .DistinctBy(x => new {x.ServerVersion, x.ServerName, x.ServerSlot}); 

這樣做的問題是,當我在短短1個項目其中有沒有重複的清單 - 當我想它會返回此代碼仍返回1,0

天天開心情況下,當所有的工作,我想,考慮到以下幾點:

{1.0, "ServerName1", "ServerSlotA", "Europe"} 
{1.0, "ServerName1", "ServerSlotA", "Pacific"} 
{1.0, "ServerName2", "ServerSlotB", "Europe"} 
{1.0, "ServerName2", "ServerSlotA", "Pacific"} 

結果如預期的那樣正確:

{1.0, "ServerName1", "ServerSlotA"} 

問題的情況下,給出以下:

{1.0, "ServerName1", "ServerSlotA", "Europe"} 

結果不正確:

{1.0, "ServerName1", "ServerSlotA"} 

預期結果:什麼

請幫助。

回答

3

你不需要MoreLINQ這裏:

List<Server> serversWithBothAffinity = filteredServers 
    .GroupBy(x => new { x.ServerVersion, x.ServerName, x.ServerSlot}) 
    .Where(g => 1 < g.Count()) 
    .Select(g => g.First()) 
    .ToList(); 

與DistinctBy的問題是,應用它後,你不能告訴多少項目是在每個「組」 - 它會產生單個項目


您還可以使用漂亮的查詢語法(當然,除了ToList部分)

var serversWithBothAffinity = 
     from s in filteredServers 
     group s by new { s.ServerVersion, s.ServerName, s.ServerSlot} into g 
     where 1 < g.Count() 
     select g.First(); 
+1

我喜歡簡單。這看起來像sql server中的'group by' +'having'。 – Alisson

+1

謝謝,這樣做更有意義 –

相關問題