0

记录 BinarySearch 方法行为的MSDN页面显示,被搜索的数组和值都可以实现 IComparable:

1) 页面描述

的任何一个value或每个元素都array必须实现IComparable 用于比较的接口。

2) 此外,该方法抛出一个InvalidOperationExceptionif

value没有实现IComparable接口,搜索遇到没有实现IComparable 接口的元素。

我试图演示这种行为(使用 IComparable 值接口)但无法。这是我的代码:

// Declarations
class Many 
{
    public string data { get; set; }
}
class One : Many, IComparable<Many>
{
    public int CompareTo(Many other)
    {
        Console.WriteLine("Comparator of One invoked");
        if (this.data.Length < other.data.Length) return -1;
        if (this.data.Length > other.data.Length) return 1;
        return 0;
    }
}
...
// action
    Many[] manies = new[] { new Many { data = "1" }, 
                            new Many { data = "22" },  
                            new Many { data = "333" }, 
                            new Many { data = "4444" }, };
    One one = new One {data="333"};
    Console.WriteLine(Array.BinarySearch(manies, one));

当我运行它时,我得到一个System.InvalidOperationException,根据文档,如果value不实现它应该会发生IComparable。但是在我看来,它确实实现了IComparable.

如何让值的比较器运行,而不是数组中的元素?

4

1 回答 1

2

既然我理解了这个问题,请将您的实施更改One为实施IComparable而不是IComparable<Many>。查看文档,我认为这是缺少的组件。如果需要,您可以实现两者,但Array.BinarySearch不会使用该IComparable<T>接口。

这段代码对我有用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestProject
{
    public class NoCompare
    {
        public string V
        {
            get;
            set;
        }
    }

    public class Compare : IComparable
    {
        public string V
        {
            get;
            set;
        }

        public int CompareTo(object obj)
        {
            NoCompare a = obj as NoCompare;

            if (a == null)
                return -1;

            return String.Compare(V, a.V);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            NoCompare[] strings = new NoCompare[] { new NoCompare() { V = "a" }, new NoCompare() { V = "b" }, new NoCompare() { V = "c" } };

            Compare t = new Compare();
            t.V = "b";

            Array.BinarySearch((object[])strings, t);
       }
    }
}
于 2013-10-07T21:31:00.333 回答