Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何形成我的节点和树泛型类_C#_Generics - Fatal编程技术网

C# 如何形成我的节点和树泛型类

C# 如何形成我的节点和树泛型类,c#,generics,C#,Generics,我有一个IList 类别类型来自SQL Server中的“我的类别”表: 表:类别 类别ID,父类别ID 这是一张桌子上典型的继承权 因此,如果我有一个包含节点关系的IList类别,那么我将试图找出它如何适合于像许多人所做的那样创建节点和树。根据使用情况,构造函数的外观和类的创建方式如何 我认为在这里创建一个通用的节点类和树类是有意义的,这样我可以在将来重用其他树类型 所以,如果我有这样的东西,它是如何被使用的,我从中受益的是什么 (此处为伪代码) 它不喜欢我对dictionary的赋值,因为它

我有一个
IList

类别类型来自SQL Server中的“我的类别”表:

表:类别

类别ID,父类别ID

这是一张桌子上典型的继承权

因此,如果我有一个包含节点关系的IList类别,那么我将试图找出它如何适合于像许多人所做的那样创建节点和树。根据使用情况,构造函数的外观和类的创建方式如何

我认为在这里创建一个通用的节点类和树类是有意义的,这样我可以在将来重用其他树类型

所以,如果我有这样的东西,它是如何被使用的,我从中受益的是什么

(此处为伪代码)


它不喜欢我对dictionary的赋值,因为它是由ToDictionary()创建的>dictionary。因此,不确定如何将此分组分组到字典,即,列表>,其中字典中的节点是我正在分组的父级的节点实例(是的,我正在对其Node.ParentId进行分组,但我希望最后将节点放在ToDictionary中)列表>是父节点.Children属性中的子节点列表。

这是更完整的实现的外观:

public class TreeNode<T>
{
    private T _item;
    private TreeNode<T> _parentNode;
    private List<TreeNode<T>> _children;

    public TreeNode(T item)
    {
        _item = item;
    }

    public void SetParentNode(T parent)
    {
        _parentNode.Item = parent;
    }

    public T Item
    {
        get { return _item; }
        set { _item = value; }
    }

    public void AddChild(T child)
    {
        _children.Add(new TreeNode<T>(child));
    }

    public void RemoveChild(T child)
    {
        var node = _children.FirstOrDefault(e => e.Item.Equals(child));
        if (node != null)
            _children.Remove(node);
    }
}
那么,如果我有这样的东西,如何使用
T
,我从中受益了什么?

泛型的使用可以在正确编写代码时花费大量时间。在上面的实现中,我们可以通过简单地更改
T
,从基本上任何我们想要的类型中创建一个树结构。因此,如果我们需要一个以上类型的树结构,这将为我们节省大量时间

var intTreeNode = new TreeNode<int>(10);
var stringTreeNode = new TreeNode<string>("hello world");

这是一个更完整的实现:

public class TreeNode<T>
{
    private T _item;
    private TreeNode<T> _parentNode;
    private List<TreeNode<T>> _children;

    public TreeNode(T item)
    {
        _item = item;
    }

    public void SetParentNode(T parent)
    {
        _parentNode.Item = parent;
    }

    public T Item
    {
        get { return _item; }
        set { _item = value; }
    }

    public void AddChild(T child)
    {
        _children.Add(new TreeNode<T>(child));
    }

    public void RemoveChild(T child)
    {
        var node = _children.FirstOrDefault(e => e.Item.Equals(child));
        if (node != null)
            _children.Remove(node);
    }
}
那么,如果我有这样的东西,如何使用
T
,我从中受益了什么?

泛型的使用可以在正确编写代码时花费大量时间。在上面的实现中,我们可以通过简单地更改
T
,从基本上任何我们想要的类型中创建一个树结构。因此,如果我们需要一个以上类型的树结构,这将为我们节省大量时间

var intTreeNode = new TreeNode<int>(10);
var stringTreeNode = new TreeNode<string>("hello world");
这可能会有帮助:

public interface ICategory
{
    int Id { get; }
    int ParentId { get; }
}

public class Category : ICategory
{
    int id;
    int parentId;

    public int Id { get { return id; }}
    public int ParentId { get { return parentId; }}
}
这是
节点
类:

public class Node<T> where T : ICategory
{
    Node<T> _parentNode;
    List<Node<T>> _children;

    public Node<T> Parent { get { return _parentNode; }}

    public Node<T> Child(int index) { return _children[index]; }

    public T Value;

    public Node(T value)
    {
        this.Value = value;
    }

    public void AddChild(T item)
    {
        Node<T> child = new Node<T>(item);
        this._children.Add(child);
        child._parentNode = this;
    }
}
这可能会有帮助:

public interface ICategory
{
    int Id { get; }
    int ParentId { get; }
}

public class Category : ICategory
{
    int id;
    int parentId;

    public int Id { get { return id; }}
    public int ParentId { get { return parentId; }}
}
这是
节点
类:

public class Node<T> where T : ICategory
{
    Node<T> _parentNode;
    List<Node<T>> _children;

    public Node<T> Parent { get { return _parentNode; }}

    public Node<T> Child(int index) { return _children[index]; }

    public T Value;

    public Node(T value)
    {
        this.Value = value;
    }

    public void AddChild(T item)
    {
        Node<T> child = new Node<T>(item);
        this._children.Add(child);
        child._parentNode = this;
    }
}

你不能把树和树节点的所有功能都做出来

而是将类数据添加到Treenode

比如说

class MyClass
{
    public int A;
    public string B;
}

...

TreeNode Node = TreeView.Nodes.Add("AAA");
MyClass Data = new MyClass();
Node.Tag = Data;
分配给TreeNode的数据不会被删除。您还可以使用整个树属性和成员节点

当使用节点的数据时,您应该做的唯一一件事就是类型转换

TreeNode Node = TreeView.Nodes[0];
MyClass Temp = Node.Tag as MyClass;

你不能把树和树节点的所有功能都做出来

而是将类数据添加到Treenode

比如说

class MyClass
{
    public int A;
    public string B;
}

...

TreeNode Node = TreeView.Nodes.Add("AAA");
MyClass Data = new MyClass();
Node.Tag = Data;
分配给TreeNode的数据不会被删除。您还可以使用整个树属性和成员节点

当使用节点的数据时,您应该做的唯一一件事就是类型转换

TreeNode Node = TreeView.Nodes[0];
MyClass Temp = Node.Tag as MyClass;


所以,这里的事情,谢谢顺便说一句。如果我有一个包含Category和ParentCategory的关系列表,我将在哪里以及如何迭代该列表以查找节点的子节点?我的意思是,当我创建一个新的TreeNode时,我需要能够迭代主列表以找到它的子元素……那么我会将整个IList传递到我的TreeNode中,这样我就可以迭代它并添加到我的TreeNode的子元素列表中吗?是的,这就是我在更新之前考虑过的。我必须迭代并为每一行创建一个新节点,这样你的单on组就可以得到这个节点的子节点?是的,没错,我没有测试这个或任何东西,所以它可能有点不对劲。另一件事是公共类节点,其中t:ICategory将它限制为一种类型,category。我希望我的节点类能够接受任何类型的关系自定义对象,所以这里的事情,谢谢顺便说一句。如果我有一个包含Category和ParentCategory的关系列表,我将在哪里以及如何迭代该列表以查找节点的子节点?我的意思是,当我创建一个新的TreeNode时,我需要能够迭代主列表以找到它的子元素……那么我会将整个IList传递到我的TreeNode中,这样我就可以迭代它并添加到我的TreeNode的子元素列表中吗?是的,这就是我在更新之前考虑过的。我必须迭代并为每一行创建一个新节点,这样你的单on组就可以得到这个节点的子节点?是的,没错,我没有测试这个或任何东西,所以它可能有点不对劲。另一件事是公共类节点,其中t:ICategory将它限制为一种类型,category。我希望我的节点类能够通过公共类树(其中T:ICategory)和公共类节点(其中T:ICategory将它们绑定到预期的特定类型)再次接受任何类型的关系自定义对象。我想要任何类型的。这样做的方法是创建一个需要NodeId和相关ParentNodeId的INode。然后我知道任何使用我的节点类或树类的东西都必须有一个NodeId和ParentNodeId可以使用;Value代表什么?@CoffeeAddict您可能知道,它是一个简单的字段(我知道我们不应该将类的字段标记为
public
,但为了简单起见,我忽略了这一点)。
Value
不代表任何东西。我只是用它来保存每个节点的
ICategory
的实际值。同样,通过公共类树(其中T:ICategory)和公共类节点(其中T:ICategory)将它们绑定到预期的特定类型。我想要任何类型的。这样做的方法是创建一个需要NodeId和相关ParentNodeId的INode。然后我知道任何使用我的节点类或树类的东西都必须有一个NodeId和ParentNodeId可以使用;什么是母鹿