2015-02-09 76 views
1

的IGrouping這聽起來很愚蠢(也許答案是很容易的),但我只是不明白這個問題的解決方案:重新組合由原始組標準

比方說,我有這樣的:

public IGrouping<T, Item> process<T>(IGrouping<T,Item> group) 
{ 
     var toIgnore = group.AsEnumerable().Where(ignoreExpression); 
     var toContinue = group.AsEnumerable().Except(toIgnore);  

     // how to group the "toContinue" Enumerable by the same criteria as the group ? 
     // 

     return newGroup; 
} 

我想要做的是:我得到這個組,我想忽略每個組中的一些項目(不是整個組)。到現在爲止還挺好。然後,我想根據原始標準對它重新組合 - 這就是我卡住的地方。

這怎麼辦?我可以從分組中找到原始標準(這是group.Key當然),但是我怎樣才能通過group.Key重新分組結果「toContinue」(甚至是toContinue.ToList())?

THX的建議

安德烈亞斯

+0

之前進行過濾爲什麼不在組合之前過濾項目? – 2015-02-09 14:50:18

+0

這個「過程」方法是工作隊列的一部分 - 我只想過濾出組中的一些項目並返回結果。隊列中還有其他處理器期望相同類型的元素(按同一個鍵分組)。 – user2553930 2015-02-09 14:53:40

回答

1

組密鑰是IGrouping Key屬性。

由於IGrouping是IEnumerable,所以一旦您創建了Where,就會丟失分組鍵。您必須在GroupBy()之前進行過濾,而不是在

+0

這一切都很清楚。問題是:如何根據原始密鑰對列表進行分組(根據原始密鑰,讓我們說一個相同項目類型的新列表)? – user2553930 2015-02-09 14:51:09

+0

既然你正在處理T,而不是一個特定的類型,你不能。這就是爲什麼我認爲你應該更好地在過程方法之前進行過濾。或者返回IEnumerable 而不是IGrouping 。 – rducom 2015-02-09 15:14:19

+0

我同意 - >由於我沒有在做我自己的分組,我只是返回IEnumerable 。然後隊列處理器需要重新分組(他知道類型,他可以做到)。 – user2553930 2015-02-09 15:16:04