【发布时间】:2009-11-18 15:12:11
【问题描述】:
我正在使用 C# 2.0 应用程序,因此 linq/lambda 答案在这里将无济于事。
基本上我面临的情况是我需要yield return 一个对象,但只有如果一个对象的属性是唯一的(分组依据)。例如,..say 我有一个用户集合,我想要一个基于名称的分组集合(我可能有 20 个 Dave,但我只想在我的集合中看到一个)。
现在我可以想到许多这可能有用的情况,但我认为在 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;
}
}
【问题讨论】:
-
如果你对用户列表进行排序,你只需要记住最后产生的值。但是请注意,排序可能是一项代价高昂的操作 (O(n log n))。
-
你在 Heinzi 的两边都提出了一个很好的观点,...不过我只是假设这个有用。
标签: iterator c#-2.0 yield group-by