根据数组列表中的指定属性查找对象的位置

本文关键字:属性 查找 对象 位置 数组 列表 | 更新日期: 2023-09-27 18:36:22

我有一个小问题:

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;
   }

其次是其他方法以及获取和设置方法

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),我听说过一些类型转换的东西,但我无法弄清楚如何解决这个问题。

例如:

用户输入 = 约翰尼

阵列列表中的某个地方是约翰尼的年龄、州等。

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

我该怎么做?

根据数组列表中的指定属性查找对象的位置

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

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

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

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

使用 List<T> 而不是 ArrayList 有很多优点。 除了支持更多功能外,它还完全类型安全(您不能将不是"游泳者"的内容添加到List<Swimmer>中)。

你应该

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

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;

您应该查找WhereFirstFirstOrDefaultSingleSingleOrDefaultEnumerable 中定义的所有扩展方法,可用于任何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