2015-02-09 54 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