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)。型キャストについて何か聞いたことがありますが、この問題を解決する方法がわかりません。

例えば:

ユーザー入力 = ジョニー

配列リストのどこかに、彼の年齢、状態などを含むジョニーがいます。

配列リストでジョニーを見つけて、彼のすべてのデータを表示したい

それ、どうやったら出来るの?

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。より多くの機能をサポートすることに加えて、完全にタイプ セーフでもあります (「スイマー」以外のものを に追加することはできませんList<Swimmer>)。

于 2013-10-22T18:00:59.370 に答える
0

ArrayList(時代遅れのプレジェネリック クラス) からList<T>(同じ考え: 配列に基づくリストですが、ジェネリックの方が優れています) に切り替える必要があります。また、一般に、 やなどの特定のクラスではなく、 のようなインターフェイスにプログラムすることもお勧めします。そして、この問題は 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;

WhereFirstFirstOrDefaultSingle、および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
于 2013-10-22T18:00:31.103 に答える