如何一步得到列表中项的索引?

13 浏览
0 Comments

如何一步得到列表中项的索引?

如何在不循环遍历列表的情况下找到一个项的索引?

目前这看起来并不太好 - 为了获取索引而两次搜索相同的项:

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

如何在不循环遍历列表的情况下找到一个项的索引?

目前这种方法不太优雅 - 为了获取索引,需要两次搜索相同的项:

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

0
0 Comments

原因:提问者想要知道如何在一步内获取列表中某个项的索引。

解决方法:可以使用List.FindIndex方法来实现。该方法会执行线性搜索,因此是一个O(n)的操作,其中n是列表的长度。使用方法是将一个Lambda表达式作为参数传递给FindIndex方法,Lambda表达式用于定义搜索条件。在Lambda表达式中,可以使用a.Prop == oProp来定义搜索条件,其中a是列表中的每个项,Prop是a对象中的属性,oProp是要搜索的属性值。FindIndex方法会返回找到的第一个符合条件的项的索引,如果没有找到,则返回-1。

0
0 Comments

问题的出现原因是在一个列表中查找特定项的索引时,使用的方法不适用于复杂对象的列表。现在我们来介绍一种适用于复杂对象列表的解决方法。

对于简单类型,可以使用IndexOf方法来获取项的索引。例如,我们有一个List<string>类型的列表,我们可以通过以下代码获取特定项的索引:

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

IndexOf方法还会在找不到元素时返回-1。但是,如果我们使用的是复杂对象的列表,这种方法就不适用了。

为了解决这个问题,我们可以使用FindIndex方法。与IndexOf不同,FindIndex方法接受一个谓词委托作为参数,该委托定义了要搜索的条件。下面是一个示例:

List<Person> people = new List<Person>();
people.Add(new Person("John", 25));
people.Add(new Person("Jane", 30));
people.Add(new Person("Bob", 35));
int index = people.FindIndex(p => p.Name == "Jane"); // 返回1

在上面的示例中,我们有一个Person类的列表。通过使用FindIndex方法和一个谓词委托,我们可以查找名字为"Jane"的人的索引。

使用FindIndex方法,我们可以在一个步骤中获取复杂对象列表中特定项的索引。这是一个适用于复杂对象列表的有效解决方法。

0
0 Comments

问题的出现原因:这篇文章中的内容讨论了如何在一个列表中获取一个项的索引。原始问题是关于如何在单个步骤中获取列表中某个项的索引。然后,文章中的讨论提供了几种解决方法。

解决方法:

一种解决方法是使用List.FindIndex方法。这是在使用List<>且只需要索引的情况下最佳的方法。

另一种解决方法是使用Select方法的一个重载,该方法接受一个索引作为谓词,将列表转换为一个(索引,值)对。然后可以通过Single方法找到满足条件的项的索引和值。

另外,还可以编写一个类似于Where的自定义扩展方法,它返回满足条件的项的索引而不是返回原始项。

关于性能方面的讨论中提到,LINQ2Objects提供程序是否能够优化掉其中一次迭代,需要深入了解LINQ的工作原理。

本文讨论了如何在单个步骤中获取列表中某个项的索引。提供了使用List.FindIndex方法和使用Select方法的解决方法。还提到了自定义扩展方法以及关于LINQ的工作原理的讨论。

0