如何一步获取列表中的项目索引?

我怎样才能find一个列表中的项目的索引,而不循环呢?

目前这看起来不是很好 – 两次search同一个项目的列表,只是为了获得索引:

var oProp = something; int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp)); 

如何List.FindIndex方法 :

 int index = myList.FindIndex(a => a.Prop == oProp); 

这种方法执行线性search; 因此,此方法是一个O(n)操作,其中n是Count。

编辑:如果你使用List<> ,你需要索引,然后List.FindIndex确实是最好的办法。 对于那些需要任何不同的东西(比如任何IEnumerable<> ),我会留下这个答案。

使用Select的重载,它在谓词中使用索引,以便将列表转换为(索引,值)对:

 var pair = myList.Select((Value, Index) => new { Value, Index }) .Single(p => p.Value.Prop == oProp); 

然后:

 Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value); 

或者如果你只想索引,而且你在多个地方使用这个索引,那么你可以很容易地编写自己的扩展方法,就像Where一样,但是不是返回原来的项目,而是返回与谓词相匹配的项目的索引。

对于简单的types,您可以使用“IndexOf”:

 List<string> arr = new List<string>(); arr.Add("aaa"); arr.Add("bbb"); arr.Add("ccc"); int i = arr.IndexOf("bbb"); // RETURNS 1. 

如果你不想使用LINQ,那么:

 int index; for (int i = 0; i < myList.Count; i++) { if (myList[i].Prop == oProp) { index = i; break; } } 

这样你只能迭代一次列表。

  1. 简单的解决scheme来查找列表中任何string值的索引。

这里是string列表的代码:

 int indexOfValue = myList.FindIndex(a => a.Contains("//insert value from list")); 
  1. 简单的解决scheme来查找列表中的任何整数值的索引。

这里是整数列表的代码:

  int indexOfNumber = myList.IndexOf(//insert number from list);