C#2.0 - 有没有办法用一个生成的迭代器块做一个`GroupBy`?

时间:2009-11-18 15:12:11

标签: iterator c#-2.0 yield group-by

我正在使用C#2.0应用程序,所以linq / lambda答案在这里没有帮助。

基本上我遇到的情况是我需要yield return一个对象,但如果它的属性是唯一的(分组依据)。例如,..说我有一个用户集合,我想要一个基于名称的分组集合(我可能有20个Daves,但我只想在我的集合中看到一个)。

现在我可以想到一些可能有用的情况,但是如果没有我明确地跟踪我正在使用另一个内部列表产生的内容,我认为它不可能在C#2.0中使用。要做到这一点,我不需要访问以前产生的集来检查它们是否存在。

我是在过度思考这个还是有意义?也许通过IEnumerable<T>界面访问产量是有意义的,所以你可以做这样的事情 -

IEnumerable<User> UsersByNameGroup(User userToGroupBy) 
{
    foreach(User u in Users)
    {
        if(!yield.Find(delegate(User u){return u.Name == userToGroupBy.Name;})) yield return u;
    } 
}

1 个答案:

答案 0 :(得分:1)

不,你必须在内部跟踪生成的元素。但请注意,基于哈希的查找数据结构(字典等)足以检测重复项。

(作为旁注:在.NET 3.5中,有内置GroupBy - 方法)