2011-06-30 54 views
2

我有一個列表,其中包含重複的項目值(按ID),但具有不同(或可能相等)的優先級。應從列表中刪除具有相同或較低優先級的重複項目。不同Linq過濾與額外條件

例如:

var items = new { 
    new { Id=2, Priority=3 }, 
    new { Id=4, Priority=4 }, 
    new { Id=1, Priority=4 }, 
    new { Id=2, Priority=5 }, 
    new { Id=4, Priority=4 } 
}; 

RemoveDuplicates(items); 

// items should now contain distinct values, 
// with highest possible priority 
var items = new { 
    new { Id=1, Priority=4 }, // this one was unique 
    new { Id=2, Priority=5 }, // this one was duplicate with higher priority 
    new { Id=4, Priority=4 }, // this one was duplicate with same priority 
}; 

是否有可能做到這一點使用LINQ?我知道我可以通過ID對列表進行分類,然後檢查相鄰的項目,但只是想檢查這是否可能。

(更新:輸入值不一定通過ID的分組)

回答

3
 var items = new[] { 
      new { Id=2, Priority=3 }, 
      new { Id=2, Priority=5 }, 
      new { Id=1, Priority=4 }, 
      new { Id=4, Priority=4 }, 
      new { Id=4, Priority=4 } 
     }; 

     var deduped = items 
      .GroupBy(item => item.Id) 
      .Select(group => group.OrderByDescending(item => item.Priority).First()) 
      .OrderBy(item => item.Id); 
1

Distinct Extension Method返回序列中的不同元件。您可以提供IEqualityComparer以確定兩個元素何時相等。但是,該方法不允許您選擇使用兩個相等元素中的哪一個。

您可以通過ID使用GroupBy Extension Method到組列表,然後從每個組中的最高優先級選擇的元素:

var query = items.GroupBy(item => item.Id) 
       .Select(g => g.MaxBy(item => item.Priority)) 
       .OrderBy(item => item.Id); 

使用MaxBy從MoreLINQ