对自定义对象使用c#arraylist.binarysearch

对自定义对象使用c#arraylist.binarysearch,c#,arraylist,C#,Arraylist,请注意,我知道ArrayList很旧…等等,但我需要知道并理解它是如何工作的,所以请耐心听我说(顺便说一句,不确定我是否拼写了bear wrog,我忘了如何拼写它…xD) 我明天要写一个测试(我在大学),但我在这个问题上走到了死胡同,我喜欢整理问题,但我就是找不到解决这个问题的办法 假设我有: class Person { private string name, surname; private int age, year born; //with more vari

请注意,我知道ArrayList很旧…等等,但我需要知道并理解它是如何工作的,所以请耐心听我说(顺便说一句,不确定我是否拼写了bear wrog,我忘了如何拼写它…xD)

我明天要写一个测试(我在大学),但我在这个问题上走到了死胡同,我喜欢整理问题,但我就是找不到解决这个问题的办法

假设我有:

class Person 
{
    private string name, surname;
    private int age, year born;
    //with more variables, etc...
我还有一节课

Class People
{
    ArrayList arlPeople = new ArrayList();
}
我知道该守则并不适用于任何工作程序,但它只是为了让我的问题更清楚

好的,我想知道,用户输入了一个名字

Console.Writeline("display all dat of the person by entering their name >>")
所以用户输入的是名称,但是

由于arraylist提供了一个
.sort()
和一个
.binarysearch()
,因此我想通过使用二进制搜索方法查找已输入姓名的人的位置

二进制搜索需要参数
(对象值)
,但如何将用户输入的名称作为对象参数传递


请帮忙

您的
Person
对象可以实现
IComparable
。也就是说,您需要添加一个
compareTo
方法来比较名称:

class Person : IComparable
{
    private string name, surname;
    private int age, year born;

    public int CompareTo(object obj) {
        return name.compareTo((obj as Person).name);
    }

    ...
}
我不推荐,但我遵循了你的例子,避免使用泛型。如果这样做,您可能还应该覆盖
Equals
GetHashCode


Tim S.有一个很好的答案,它使用了
IComparer
。仔细想想,这可能更有意义,这取决于你认为
Person
s本质上具有可比性还是仅仅能够被比较

您的
Person
对象可以实现
IComparable
。也就是说,您需要添加一个
compareTo
方法来比较名称:

class Person : IComparable
{
    private string name, surname;
    private int age, year born;

    public int CompareTo(object obj) {
        return name.compareTo((obj as Person).name);
    }

    ...
}
我不推荐,但我遵循了你的例子,避免使用泛型。如果这样做,您可能还应该覆盖
Equals
GetHashCode

Tim S.有一个很好的答案,它使用了
IComparer
。仔细想想,这可能更有意义,这取决于你认为
Person
s本质上具有可比性还是仅仅能够被比较

这是有效的:

class NameComparer : IComparer
{
    public int Compare(Object x, Object y)
    {
        var xs = (Swimmer)x;
        var ys = (Swimmer)y;
        return xs.Name.CompareTo(ys.Name);
    }
}
class Swimmer
{
    public string Name { get; set; }
}
class Swimmers
{
    ArrayList AllSwimmers;
    IComparer nameComparer = new NameComparer();

    public Swimmers()
    {
        AllSwimmers = new ArrayList();
        AllSwimmers.Add(new Swimmer { Name = "Tom" });
        AllSwimmers.Add(new Swimmer { Name = "Joe" });
        AllSwimmers.Add(new Swimmer { Name = "George" });
        AllSwimmers.Sort(nameComparer);
    }

//some other methods in between

    public int GetOnName()
    {
        Console.WriteLine("Enter the name of the swimmer");
        string name = Console.ReadLine();

        int pos = AllSwimmers.BinarySearch(new Swimmer { Name = name }, nameComparer);

        Console.WriteLine(pos);

        return pos;

    }
}
这项工作:

class NameComparer : IComparer
{
    public int Compare(Object x, Object y)
    {
        var xs = (Swimmer)x;
        var ys = (Swimmer)y;
        return xs.Name.CompareTo(ys.Name);
    }
}
class Swimmer
{
    public string Name { get; set; }
}
class Swimmers
{
    ArrayList AllSwimmers;
    IComparer nameComparer = new NameComparer();

    public Swimmers()
    {
        AllSwimmers = new ArrayList();
        AllSwimmers.Add(new Swimmer { Name = "Tom" });
        AllSwimmers.Add(new Swimmer { Name = "Joe" });
        AllSwimmers.Add(new Swimmer { Name = "George" });
        AllSwimmers.Sort(nameComparer);
    }

//some other methods in between

    public int GetOnName()
    {
        Console.WriteLine("Enter the name of the swimmer");
        string name = Console.ReadLine();

        int pos = AllSwimmers.BinarySearch(new Swimmer { Name = name }, nameComparer);

        Console.WriteLine(pos);

        return pos;

    }
}

但是,如果只给出一个人的名字,如何解析person对象的索引呢?我相信这就是他的问题。@ByteBlast这是一个丑陋的解决方案,但是你可以用所需的
名称实例化一个新的
Person
,然后用它执行搜索。但是,如果只给出了Person的名称,你如何解析Person对象的索引呢?我相信这就是他的问题。@ByteBlast这是一个丑陋的解决方案,但是你可以用所需的
名称实例化一个新的
,然后用它执行搜索。