根据数组列表中的指定属性查找对象的位置
本文关键字:属性 查找 对象 位置 数组 列表 | 更新日期: 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>
这样的接口而不是特定的类,如ArrayList
或List<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;
您应该查找Where
、First
、FirstOrDefault
、Single
和 SingleOrDefault
(Enumerable
中定义的所有扩展方法,可用于任何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