2

我正在做一个需要跟踪的项目:

  • 5-6 仅字符串名称的根项
  • 每个根项都需要有多个不同标识符类型(int、string、float 等)的子项。一个根的所有孩子都将是相同的类型,但每个根将有不同的孩子类型
  • 用户需要能够从每个根目录添加/删除子节点
  • 我稍后需要单独访问每个孩子,并在需要时执行字符串操作和解析

我考虑过可能使用字典,其中键是字符串,值是对象列表。或者为每个根项设置一个唯一的类,并且每个类都包含一个子项列表。

有人有什么好的建议吗?我对 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");

如果您想将所有根保存在一个对象中,您可以编写自己的类或使用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

听起来Dictionary<string, Tuple<type1, type 2, etc>>是个不错的候选人。

键将是字符串(根)。根的孩子是一个元组。我们可以向元组添加项目。感谢您指出了这一点。

Tuple 的良好起点

于 2012-06-01T19:52:37.580 回答
0

这是解决问题的一种方法。有很多铸造需要进行,但它可以完成工作:

    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 回答