2

私は C# 2.0 アプリを使用しているため、linq/lambda の回答はここでは役に立ちません。

yield return基本的に、オブジェクトが必要な状況に直面していますが、プロパティが一意である場合 (Group By)のみです。たとえば、ユーザーのコレクションがあり、名前に基づいてグループ化されたコレクションが必要だとします (20 人の Dave がいるかもしれませんが、コレクションには 1 つだけ表示したい)。

これが役立つ状況をたくさん思いつくことができますが、C# 2.0 では、別の内部リストで何を生成しているかを明示的に追跡しない限り、これは不可能だと思います。せずにそれを行うには、以前に生成されたセットにアクセスして、それらが存在するかどうかを確認する必要があります。

私はこれを考えすぎていますか、それとも理にかなっていますか? おそらく、IEnumerable<T>インターフェイスを介してyieldにアクセスすることは理にかなっているので、次のようなことができるでしょう-

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

1 に答える 1

1

いいえ、生成された要素を内部で追跡する必要があります。ただし、重複を検出するには、ハッシュベースの検索データ構造 (辞書など) で十分であることに注意してください。

(補足として: .NET 3.5 には組み込みのメソッドがありますGroupBy)

于 2009-11-18T15:18:21.600 に答える