C # 2.0 - Есть ли способ сделать `GroupBy` с блоком итератора? - PullRequest
2 голосов
/ 18 ноября 2009

Я работаю с приложением C # 2.0, поэтому ответы linq / lambda здесь не помогут.

По сути, я столкнулся с ситуацией, когда мне нужно yield return объект, но только , если один, если его свойства уникальны (Group By). Например, .. скажем, у меня есть коллекция пользователей, и я хочу сгруппированную коллекцию, основанную на имени (у меня может быть 20 Daves, но я бы хотел видеть только одного в моей коллекции).

Теперь я могу подумать о множестве ситуаций, в которых это может быть полезно, но я не думаю, что это возможно в C # 2.0 без моего явного отслеживания того, что я получаю с другим внутренним списком. Чтобы сделать это без меня, мне нужно иметь доступ к ранее полученному набору, чтобы проверить, существуют ли они.

Я слишком обдумываю это или имеет смысл? Возможно, имеет смысл иметь доступ к yield через интерфейс 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 Ответ

1 голос
/ 18 ноября 2009

Нет, вам придется отслеживать сгенерированные элементы внутри. Но обратите внимание, что для обнаружения дубликатов достаточно хаст-структуры данных поиска (словарь и т. Д.).

(Как примечание: в .NET 3.5 есть встроенные GroupBy -методы)

...