如何一步获取列表中的项目索引?
我怎样才能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; } }
这样你只能迭代一次列表。
- 简单的解决scheme来查找列表中任何string值的索引。
这里是string列表的代码:
int indexOfValue = myList.FindIndex(a => a.Contains("//insert value from list"));
- 简单的解决scheme来查找列表中的任何整数值的索引。
这里是整数列表的代码:
int indexOfNumber = myList.IndexOf(//insert number from list);