比较类型对象"对象"在C#中

时间:2016-01-25 19:02:47

标签: c# data-structures tree binary-search-tree

我正在尝试在C#中实现树数据结构,我已在C++中完成了100次 但是,当我尝试保持树的通用性以接受任何数据类型时,我已经让每个Node在{{1}类型的对象中拥有它的数据},如下所示:

Object

但是当我尝试实现 public class Node { public object Data; public Node Right; public Node Left; public Node(object value) { NodeContent = value; Right = Left = null; } } 时,我需要比较insert类型的两个对象,以便知道是否在左侧或右侧插入新节点当前节点。当我试着检查这个

Object

其中 if(value < childPtr.Data) 是要插入的值,我收到一条错误消息,说我无法比较value类型的两个对象。那么有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

您的方法存在的问题是Data可以是任何类型。您的设计允许您将多种类型放入同一个树中。因此,一个节点可能具有string而另一个节点可能具有double,而第三个节点可能具有对用户定义类型的引用。如果您使Node构造函数采用IComparable实例,则假设树中的所有项都属于同一类型,或者他们的IComparable接口实现知道如何比较所有可能的数据类型的值。

简而言之,虽然你所做的事情会起作用,但它并不是安全的。

你所拥有的是一件很像C的事情。在C ++中,你使用模板来避免这种憎恶。在C#中,您使用泛型。

我赞同评论中提出的建议:如果你想要一个通用的数据结构,制作一个通用的数据结构。例如,如果您想要编写的整数列表,请使用内置集合:

var list_of_integers = new List<int>();

如果你想要一个字符串列表:

var list_of_strings = new List<string>();

如果要创建通用树集合,请从以下开始:

public class MyGenericTree<T>
{
    public class Node
    {
        public T Data;
        public Node Left;
        public Node Right;

        public Node(T data)
        {
            Data = data;
        }
    }

    private readonly IComparer<T> _comparer;

    public MyGenericTree(IComparer<T> comparer = null)
    {
        _comparer = comparer ?? Comparer<T>.Default;
    }
}

然后用:

创建它
var myTree = new MyGenericTree<string>(); // or int, or whatever type

如果您想要自定义比较功能,请编写:

// Create a tree that stores case-insensitive strings
var myTree = new MyGenericTree<string>(StringComparer.CurrentCultureIgnoreCase);

这会强制Data始终为兼容类型。您可以使用该类型的默认比较器,也可以使用传递给构造函数的比较器接口。

在进行比较时,它是:

int a = _comparer.Compare(node1, node2);
if (a < 0)
    // node1 < node2
else if (a > 0)
    // node1 > node2
else
    // node1 == node2

如果您确实想在树中存储无类型object引用,可以轻松编写:

var myTree = new MyGenericTree<object>(some_object_comparer);

虽然为什么你想做这样的事情有点神秘。

我知道仿制药开始看起来有点奇怪,但经过一天左右的工作后,你就会认识到它们非常灵活,同时也是类型安全的。

答案 1 :(得分:1)

由于您需要从数据中进行比较,因此更好的方法是:

if(value.CompareTo(childPtr.Data) < 0)

以后你可以这样做:

Tango AR Camera