3

Windows アプリケーションに次のようなクラスがあります。

public class Pets
{
  String Name {get;set;}
  int Amount {get;set;}
}

私の他のクラスの1つで、そのクラスのリストをそのように作成しました。

List<Pets> myPets = new List<Pets>();
myPets.Add(new Pets{ Name = "Fish", Amount = 8});
myPets.Add(new Pets{ Name = "Dogs", Amount = 2});
myPets.Add(new Pets{ Name = "Cats", Amount = 2});

Petswhosのインデックスを取得する方法はありName = "Fish"ますか?

私はこれができることに気づきました

int pos = 0;

for(int x = 0; x<myPets.Count;x++)
{
    if( myPets[x].Name == "Fish")
    {
        pos = x;
    }
}

しかし、myPets私が探しているものを見つけるためにそれらをループするのに長い時間がかかります。上記のタスクを完了する別の方法はありますか。それは私のアプリケーションをより速く実行しますか? myPetsたくさんのアイテムが入っている場合。

4

2 に答える 2

2

現時点でデータを構造化する方法は、リストが大きい場合にペットの名前で検索するのには適していません。

したがって、あなたが提案するように手動で反復することは、ブルートフォースアルゴリズムである線形検索FindIndexとして知られています。コレクションに N 個のアイテムがある場合、アイテムを見つけるための最悪のシナリオは N 回の反復です。これは、Big O 記法を使用して O(N) として知られています。検索の速度は、コレクション内のアイテムの数に比例して増加します。

検索を高速化するには、別のデータ構造 (ハッシュテーブルなど) に変更するか、データベースを使用するか、バイナリ検索( )などの別の検索アルゴリズムを実装する必要がありますO(log(n)) complexity

例として、この質問を見てください: コレクションが注文されたときに、LINQ はバイナリ検索を使用できますか?

于 2013-09-16T06:17:25.900 に答える
1

リストのアイテムにアクセスするためだけにインデックスを見つけたい場合は、代わりに Dictionary を使用できます。

var pets = new Dictionary<string, int>();
pets.Add("Dogs", 2);
pets.Add("Fish", 8);
int amount = pets["Fish"];
于 2013-09-16T05:42:33.770 に答える