2016-01-25 32 views
4

我一直在使用這樣的:獲取具體區分記錄到一個列表使用LINQ

return myListOfContacts.DistinctBy(e => e.Id).Where(e => e.CompanyId == companyId).ToList(); 

它返回一個不同的列表,如要求。問題是,當記錄重複時,返回的記錄是列表中的第一個。

例如,如果在我的聯繫人我有這些:

[ID - 使用ContactID - 姓名 - FlagIWantThisOne]

1 - 99 - John - true 
2 - 56 - Mike - false 
2 - 56 - Mike - true 
3 - 13 - Dave - false 

它返回3個記錄:

約翰,邁克和戴夫。

但我想要的「Mike」記錄是標記爲真的記錄。

總而言之,如果一條記錄是重複的,則該列表應該返回標誌設置爲true的列表並忽略其他列表。

我在那裏得到了distinctBy,但它返回它在列表中找到的第一個。

回答

4

您可以試試:

myListOfContacts.GroupBy(e => e.Id) 
       .Select(g => g.OrderByDescending(r => r.FlagIwantThisOne).First()) 
       .ToList(); 

的邏輯是:

集團的標識。然後,按組降序(true> false)進行排序,並從每個組中選取第一個。

2

首先排列列表應該有所幫助。另外,我會把where子句在第一,性能方面的原因:

return myListOfContacts.Where(e => e.CompanyId == companyId) 
         .OrderBy(e => e.Flag) 
         .DistinctBy(e => e.Id) 
         .ToList(); 
0

嘗試扭轉名單:

return myListOfContacts 
    .Reverse() 
    .DistinctBy(e => e.Id) 
    .Where(e => e.CompanyId == companyId) 
    .ToList(); 

但我真的認爲你應該避免重複記錄。

2

不是訂購分組元素,這是O(N *日誌(N))的時間複雜度,你可以使用簡單的O(N)搜索加退回到原來的邏輯:

return myListOfContacts 
    .Where(e => e.CompanyId == companyId) 
    .GroupBy(e => e.Id, (key, elements) => 
     elements.FirstOrDefault(e => e.FlagIWantThisOne) ?? elements.First())     .OrderBy(e => e.Flag) 
    .ToList(); 

,它基本上是總而言之,如果記錄重複,則列表應返回標誌設置爲true的標誌並忽略其他標誌。「

相關問題