2

私は追跡する必要があるプロジェクトに取り組んでいます:

  • 5-6 文字列名だけのルート項目
  • 各ルート項目には、異なる識別子タイプ (int、string、float など) の複数の子が必要です。1 つのルートのすべての子は同じ型になりますが、各ルートの子の型は異なります
  • ユーザーは、各ルートから子を追加/削除できる必要があります
  • 後で各子に個別にアクセスし、必要に応じて文字列操作と解析を実行する必要があります

キーが文字列で、値がオブジェクトのリストである辞書を使用することを考えました。または、ルート項目ごとに一意のクラスを持ち、各クラスには子のリストが含まれます。

誰にも良い提案はありますか?私はまだOOPにかなり慣れていないので、ご容赦ください:)

ありがとう!

4

4 に答える 4

6
public interface IRoot {}

public class RootItem<T> : IRoot
{
    public string Name { get; set; }
    public List<T> Children {get; set; }
}

そして、Dictionary<string, IRoot>それらすべてを保持するために保持します。

Dictionary<string, IRoot> hair = new Dictionary<string, IRoot>();
hair.Add(
  new RootItem<int>()
      {
        Name = "None",
        Children = new List<int>() {1, 2, 3, 4}
      }
);

hair.Add(
  new RootItem<decimal>()
      {
        Name = "None",
        Children = new List<decimal>() {1m, 2m, 3m, 4m}
      }
);
于 2012-06-01T19:56:40.670 に答える
2

子を含むジェネリッククラスはどうですかList<T>

public class Root<T>
{
    private List<T> children = null;

    public Root(string name)
    {
        Name = name;
    }

    public string Name { get; set; }

    public List<T> Children
    {
        get
        {
            if (children == null)
            {
                children = new List<T>();
            }

            return children;
        }
    }
}

Root<int> intRoot = new Root<int>("IntRoot");
intRoot.Children.Add(23);
intRoot.Children.Add(42);

Root<string> stringRoot = new Root<string>("StringRoot");
stringRoot.Children.Add("String1");
stringRoot.Children.Add("String2");
stringRoot.Children.Add("String3");
stringRoot.Children.Add("String4");

すべてのルートを 1 つのオブジェクトに保持したい場合は、独自のクラスを作成するか、以下を使用できますTuple

var rootGroup = Tuple.Create(intRoot, stringRoot);
// intRoot is accessible as rootGroup.Item1
// stringRoot is accessible as rootGroup.Item2
于 2012-06-01T19:56:34.510 に答える
0

ここにそれについて行く1つの方法があります。多くのキャスティングを行う必要がありますが、これで作業は完了です。

    static void Main(string[] args)
    {
        Dictionary<string, IRootCollection> values = new Dictionary<string, IRootCollection>();

        values["strings"] = new RootCollection<string>();
        (values["strings"] as RootCollection<string>).Add("foo");
        (values["strings"] as RootCollection<string>).Add("bar");

        values["ints"] = new RootCollection<int>();
        (values["ints"] as RootCollection<int>).Add(45);
        (values["ints"] as RootCollection<int>).Add(86);
    }

    interface IRootCollection { }
    class RootCollection<T> : List<T>, IRootCollection { }
于 2012-06-01T20:23:03.657 に答える
0

Dictionary<string, Tuple<type1, type 2, etc>>有力候補になりそうです。

キーは文字列 (ルート) になります。ルートへの子はタプルです。タプルにアイテムを追加できます。これを指摘してくれてありがとう。

タプルの良い出発点

于 2012-06-01T19:52:37.580 に答える