我有一个小问题:
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)
,我听说过类型转换,但我无法弄清楚如何解决这个问题。
例如:
用户输入=约翰尼
在arraylist的某个地方是约翰尼与他的年龄,州等等。我想在arraylist中找到Johnny并显示他的所有数据
我该怎么做?
答案 0 :(得分:2)
我建议使用List<Swimmer>
代替ArrayList
。这将允许您简单地使用:
pos = AllSwimmers.FindIndex(s => s.Name == name);
请注意,这需要在Name
类中添加Swimmer
属性,该类属于公开:
public string Name { get { return this.name; } }
使用List<T>
代替ArrayList
有很多好处。除了支持更多功能外,它还是完全类型安全的(您不能向List<Swimmer>
添加不是“游泳者”的东西。)
答案 1 :(得分:0)
你应该从ArrayList
(一个过时的前泛型类)切换到List<T>
(同样的想法:一个由数组支持的列表,但对于泛型更好)。一般而言,good practice也可以编程为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
之间的差异({{3}中定义的所有扩展方法) },可在任何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