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

Dan*_*son 180 c# linq lookup

如何在不循环的情况下找到列表中项目的索引?

目前这看起来不太好 - 在列表中搜索相同的项目两次,只是为了得到索引:

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.

  • @lennyy,以防你不知道:“var”在 C# 中完全没问题...... (6认同)
  • 供参考,如果找不到该项目;它将返回-1 (5认同)
  • `int index`怎么样? (2认同)
  • @DylanChensky他一直在编写JS代码 (2认同)
  • @ims1234 为了可读性,我更喜欢显式键入。除非是新建的时候,不需要在一行中出现两次类名 (2认同)

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,但是它不是返回原始项,而是返回与谓词匹配的那些项的索引.

  • 看来他想要的只是索引。List&lt;&gt;.FindIndex(Predicate&lt;&gt;) 是最好的方法。尽管问题标题会暗示,但OP的描述非常清楚,他只需要索引“int theThingIActuallyAmInterestedIn” (2认同)

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)

这样你只迭代一次列表.

  • @KingKing没人说是的. (22认同)
  • 可能不是相同的代码,List在这里和那里有一些简洁的优化.但是我发现很难相信他们可以在低于O(n)的范围内搜索无序列表,所以我会说他们在实践中可能非常相似. (2认同)

小智 5

  1. 查找列表中任何字符串值的索引的简单解决方案。

这是字符串列表的代码:

int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
Run Code Online (Sandbox Code Playgroud)
  1. 查找列表中任何Integer值的索引的简单解决方案。

这是整数列表的代码:

    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)