3

我的 Windows 应用程序中有一个类,如下所示:

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

在我的其他课程中,我像这样制作了该课程的列表。

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 次迭代。这称为使用大 O 表示法的 O(N)。搜索速度随着您收藏中的项目数量线性增长。

为了更快地搜索,您需要更改为不同的数据结构(如 Hashtable)、使用数据库或实现不同的搜索算法,如二分搜索( O(log(n)) complexity)。

看一下这个问题的例子: 当集合被排序时,LINQ 可以使用二分搜索吗?

于 2013-09-16T06:17:25.900 回答
1

如果您只想查找索引以访问 List 的项目,您可以使用 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 回答