列出获取列表索引的操作

时间:2013-09-16 05:21:56

标签: c# windows-8 collections

我的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});

有没有办法可以获得Pets whos Name = "Fish"的索引?

我意识到我可以做到这一点

int pos = 0;

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

但是如果我在myPets中有很多项目,那么需要很长时间才能找到我正在寻找的项目。是否有其他方法可以完成上述任务。这会让我的应用程序运行得更快?在myPets包含大量项目的情况下。

2 个答案:

答案 0 :(得分:2)

如果列表很大,目前您的数据结构方式不适合按宠物名称搜索。

因此,如您所建议的那样手动迭代以及FindIndex正在做什么被称为linear search,这是一种强力算法。如果您的集合中有N个项目,那么查找项目的最坏情况是N次迭代。这被称为使用Big O表示法的O(N)。搜索速度随着集合中的项目数量呈线性增长。

为了加快搜索速度,您需要更改为不同的数据结构(如Hashtable),使用数据库或实现其他搜索算法,例如binary searchO(log(n)) complexity)。

看看这个问题的例子: Can LINQ use binary search when the collection is ordered?

答案 1 :(得分:1)

如果您只想查找索引项目的索引,则可以使用词典。

var pets = new Dictionary<string, int>();
pets.Add("Dogs", 2);
pets.Add("Fish", 8);
int amount = pets["Fish"];