使用哪种数据结构
本文关键字:数据结构 | 更新日期: 2023-09-27 18:36:00
我正在做一个需要跟踪的项目:
- 5-6 字符串名称的根项
- 每个根项需要具有多个不同标识符类型(整数、字符串、浮点数等)的子项。一个根的所有子根将具有相同的类型,但每个根将具有不同的子类型
- 用户需要能够从每个根添加/删除子项
- 稍后我需要单独访问每个子项,并在需要时执行字符串操作和解析
我想过也许使用字典,其中键是字符串,值是对象列表。或者为每个根项提供一个唯一的类,每个类将包含一个子项列表。
有人有什么好的建议吗?我对OOP还很陌生,请耐心等待:)
谢谢!
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}
}
);
一个带有包含子项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
听起来Dictionary<string, Tuple<type1, type 2, etc>>
是一个很好的候选人。
键将是字符串(根)。根的子元是一个元组。我们可以将项目添加到元组。感谢您指出这一点。
元组的良好起点
这里有一种方法可以解决这个问题。有很多选角需要发生,但它可以完成工作:
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 { }