1

我有一个小问题:

class Swimmer
{
   private string name;
   private string province;
   private int age;
   private int[] times;

   public Swimmer(string name, string province, int age, int[] times)
   {
       this.name = name;
       this.province = province;
       this.age = age;
       this.times = times;
   }

其次是其他方法以及get和set方法

class Swimmers
{
    ArrayList AllSwimmers;

    public Swimmers()
    {
        AllSwimmers = new ArrayList();
    }

//some other methods in between

    public int GetOnName()
    {
        int pos = -1;

        Console.WriteLine("Enter the name of the swimmer");
        string name = Console.ReadLine();
        AllSwimmers.Sort();

        pos = AllSwimmers.BinarySearch(AllSwimmers) ;

        Console.WriteLine(pos) ;

        return pos;

    }

基于游泳者,我想输入游泳者的名字,该方法GetOnName()需要对游泳者的名字进行二分搜索。我不知道传递什么作为 BinarySearch 参数,参数是ArrayList.BinarySearch(Object value),我听说过一些类型转换,但我不知道如何解决这个问题。

例如:

用户输入 = 约翰尼

数组列表中的某处是 Johnny,他的年龄、状态等。

我想在数组列表中找到 Johnny 并显示他的所有数据

我怎么做?

4

2 回答 2

2

我建议使用List<Swimmer>而不是ArrayList. 这将允许您简单地使用:

pos = AllSwimmers.FindIndex(s => s.Name == name);

请注意,这将需要向Name您的Swimmer类添加一个公开的属性:

public string Name { get { return this.name; } }

List<T>使用代替有很多优点ArrayList。除了支持更多功能之外,它还完全是类型安全的(你不能在 a 中添加不是“Swimmer”的东西List<Swimmer>)。

于 2013-10-22T18:00:59.370 回答
0

您应该从ArrayList(过时的预泛型类)切换到List<T>(相同的想法:由数组支持的列表,但使用泛型更好)。通常,对接口进行编程而不是特定类(如or )也是一种很好的做法。这个问题可以用 LINQ 轻松解决,(特别是如果你想要对象,而不是索引)而不是使用二分搜索(这需要根据你想要搜索的属性对列表进行排序)。IList<T>ArrayListList<T>

IList<Swimmer> AllSwimmers;

public Swimmers()
{
    AllSwimmers = new List<Swimmer>();
}

...

string name = Console.ReadLine();
Swimmer swimmer = AllSwimmers.Single(x => x.Name == name);
return swimmer;
// or, if you really want the index, remove the above line and continue with:
int pos = AllSwimmers.IndexOf(swimmer);
return pos;

您应该查找 , , , 和 (在 中定义的所有扩展方法,可用于任何 )之间的区别WhereFirstFirstOrDefault根据SingleSingleOrDefaultEnumerable具体IEnumerable<T>实例选择最有意义的方法。

对于大小合理的集合,LINQ 扩展方法的线性搜索是一个不错的选择。如果您有一个非常大的列表并且可以对其进行一次排序,然后您将对其进行大量搜索,那么使用二进制搜索可能是一个好主意。(或者如果您只是出于学术原因尝试进行二进制搜索,例如,这是您的家庭作业)然后您可以List<T>.BinarySearch在适当地对列表进行排序后使用。你需要一个IComparer<Swimmer>比较名字的。

// we're using methods on List<T> now, can't use the interface IList<T>
List<Swimmer> AllSwimmers;
IComparer<Swimmer> nameComparer = new NameComparer();

// make sure it's sorted first
// only need to do this when you add/remove/change items
AllSwimmers.Sort(nameComparer);

// then when you're doing the binary search
int pos = AllSwimmers.BinarySearch(new Swimmer { Name = name }, nameComparer);

// NameComparer class left as an exercise
于 2013-10-22T18:00:31.103 回答