如何在不循环的情况下找到列表中项目的索引?
目前这看起来不太好 - 在列表中搜索相同的项目两次,只是为了得到索引:
var oProp = something;
int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
Run Code Online (Sandbox Code Playgroud)
Ale*_*ici 392
List.FindIndex方法怎么样:
int index = myList.FindIndex(a => a.Prop == oProp);
Run Code Online (Sandbox Code Playgroud)
该方法执行线性搜索; 因此,该方法是O(n)操作,其中n是Count.
Jos*_*uez 95
对于简单类型,您可以使用"IndexOf":
List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // RETURNS 1.
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 71
编辑:如果你只使用a List<>而你只需要索引,那么List.FindIndex确实是最好的方法.我会把这个答案留给那些需要任何不同的人(例如在任何人之上IEnumerable<>).
使用其重载Select在谓词中获取索引,因此您将列表转换为(索引,值)对:
var pair = myList.Select((Value, Index) => new { Value, Index })
.Single(p => p.Value.Prop == oProp);
Run Code Online (Sandbox Code Playgroud)
然后:
Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);
Run Code Online (Sandbox Code Playgroud)
或者如果你只想要索引并且你在多个地方使用它,你可以轻松编写自己的扩展方法Where,但是它不是返回原始项,而是返回与谓词匹配的那些项的索引.
gza*_*axx 13
如果您不想使用LINQ,那么:
int index;
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Prop == oProp)
{
index = i;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这样你只迭代一次列表.
小智 5
这是字符串列表的代码:
int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
Run Code Online (Sandbox Code Playgroud)
这是整数列表的代码:
int indexOfNumber = myList.IndexOf(/*insert number from list*/);
Run Code Online (Sandbox Code Playgroud)
小智 5
如果有人想知道版本Array,它是这样的:
int i = Array.FindIndex(yourArray, x => x == itemYouWant);
Run Code Online (Sandbox Code Playgroud)