2009-07-29 7 views
0

ユーザーのグループを格納するコレクションを作成したいと考えています。ユーザーは複数のグループのメンバーになることができ、グループはネストすることができます。選択したグループは異なるIEnumerable <userを返します。ユーザーのグループを格納するコレクションはどれですか?

私は標準一覧<Tを使用して、もちろん最初からこれを書くことができる>、辞書< T, U>などのコレクションが、すでにこの行動の多くを公開する組み込みのコレクションがありますか?

ありがとうございます!

答えて

2

私はこのような何かをするだろう。 UserタイプのGroupsプロパティはIEnumerable<Group>として公開されていますが、内部的にはHashSet<Group>として実装されているので、必要に応じて別のリストを保持できます。

+0

ハッシュセットは役に立ちました。結局ネストされたグループは必要ないと判明しました。結合されたり交差したりすることができるカテゴリ。ハッシュセットは、ユニオン操作または交差操作が別々のユーザーのIEnumerableを返すように処理します。 私は、ユーザがどのカテゴリに属しているかを知っているべきではないという考えを好まなかったので、実装していませんでした。 – Dabblernl

0

一般的なList<T>が動作すると思います(Tはあなたのユーザーを保持するクラスです)。自体は問題ないはずのユーザーを保持するためにList<T>を使用し

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     List<User> users = new List<User> 
     { 
      // use a List<T> to hold the users themselves 
     }; 
    } 
} 

class Group 
{ 
    public Group NestedGroup { get; set; } 
} 

class User 
{ 
    // Store the groups in a HashSet<T> to keep 
    // a distinct list. 
    HashSet<Group> groups; 

    public IEnumerable<Group> Groups 
    { 
     get { return groups; } 
    } 
} 

+0

基本的なListによって提供されるものよりも少しだけ機能が必要だと思うでしょう –

+0

List はユーザーを保持し、UserクラスはDictionaryまたはHashSetのプロパティを公開すると思いますか?普通のもののように見えませんか? (しかし、私は何かを逃しているかもしれません - 私はしばしば!) –

+0

私はちょうど質問を間違って読んでいるかもしれませんが、私はまだ説明した機能のどの部分がユーザークラスで世話されているのか不明ですデータ構造によって処理されています –

0

List<T>を使用すると、この情報を保存することができます。親グループと子グループのリストを持つグループを持つことができ、各グループにはメンバーのリストなどがあります。

IEnumerable<User>を返却するという点では、これはEnumerable.SelectManyを使用して行う必要があります。そこにあるMSDNのサンプルを見てください。複数のコレクションにまたがる複数の要素があるペットや所有者と同様のものがあります。

0

古いリレーショナルデータベースが必要なようです。できるだけSQLiteを投げて行ってください。

そうでなければ...私は時には複数の辞書とリストを使ってこれを行ってきました。グループの辞書があり、各グループはリストです。次に、ある種類のキーでユーザーを格納する別の辞書。各ユーザーは、そのように複数のグループに存在することができます。

関連する問題