c# - 比较 3 个对象

标签 c# comparison comparator icomparable icomparer

我正在用 C# 编写通用二叉树。

在我的应用程序的一部分中,我需要按距离顺序排序。

从A到C,从B到C。

像这样:

if ((A->C) == (B->C))  
    return 0;
else if((A->C) < (B->C))
    return -1;
else
    return 1;

但问题是,我只能在两个对象之间进行比较......并且我需要某种比较器。

创建一个像“开始和结束之间的距离”这样的类是正确的解决方案吗?我认为它产生了太多垃圾。

有什么解决办法吗? 谢谢;-)

编辑:

public AvlNode<T> _left, _right;
public Stack<T> _obj;

(...)

public AvlNode<T> Insert(T obj, IComparer<T> iComparer)
    {
        if (iComparer.Compare(obj, _obj.Peek()) > 0)
        {
            _right = (_right != null) ? _right.Insert(obj, iComparer) : new AvlNode<T>(obj);
            return Balance();
        }
        else if (iComparer.Compare(obj, _obj.Peek()) < 0)
        {
            _left = (_left != null) ? _left.Insert(obj, iComparer) : new AvlNode<T>(obj);
            return Balance();
        }
        else
        {
            _obj.Push(obj);  // distance already exists but object may be different, that's why I use a stack...
            return this;
        }
    }

我没有可用的 IComparer...

编辑:

问题解决了,现在我有了一个可以工作的 IComparer!

public class ObjectDistanceComparer : IComparer<EraObject>
{
    Vector3 _position;


    public ObjectDistanceComparer(Vector3 position)
    {
        _position = position;
    }

    int IComparer<EraObject>.Compare(EraObject obj1, EraObject obj2)
    {
        float d1 = (_position - obj1._position).LengthSquared();
        float d2 = (_position - obj2._position).LengthSquared();
        return (d1 == d2)? 0 : (d1 < d2)? -1 : 1;
    }
}

谢谢;-)

最佳答案

您可以向 Node 类添加额外的属性:

public class Node : IComparable
{
   Node Parent{get;set;}
   Node LChild {get;set;}
   Node RChild {get;set;}
   Node C {get;set;}

   public int CompareTo(object o)
   {
      // Now you passed C in your object, do stuff ...
   }
}

关于c# - 比较 3 个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12023294/

相关文章:

java - 为什么不能在 while 循环中将 array[n] 与 null 进行比较?

c++ - unordered_map 中的排序 cmp 函数

java - 使用比较器作为嵌入类,母类(在克隆中初始化)字段在比较方法中不可见

c# - 使用 String.Join 将数组转换为字符串后从字符串中删除多余的逗号 (C#)

c# - 如何使复选框的文本随着表单宽度的变化而自动换行?

c# - 如何循环 Console.ReadLine?

python - 比较可变数量的列表是否相等的更好方法

python - 双等于vs在python中

Java 8 Lambda 表达式

c# - 捕获没有焦点的击键