如何一步得到列表中项的索引?
如何一步得到列表中项的索引?
如何在不循环遍历列表的情况下找到一个项的索引?
目前这看起来并不太好 - 为了获取索引而两次搜索相同的项:
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));
问题的出现原因是在一个列表中查找特定项的索引时,使用的方法不适用于复杂对象的列表。现在我们来介绍一种适用于复杂对象列表的解决方法。
对于简单类型,可以使用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
方法,我们可以在一个步骤中获取复杂对象列表中特定项的索引。这是一个适用于复杂对象列表的有效解决方法。
问题的出现原因:这篇文章中的内容讨论了如何在一个列表中获取一个项的索引。原始问题是关于如何在单个步骤中获取列表中某个项的索引。然后,文章中的讨论提供了几种解决方法。
解决方法:
一种解决方法是使用List.FindIndex
方法。这是在使用List<>
且只需要索引的情况下最佳的方法。
另一种解决方法是使用Select
方法的一个重载,该方法接受一个索引作为谓词,将列表转换为一个(索引,值)对。然后可以通过Single
方法找到满足条件的项的索引和值。
另外,还可以编写一个类似于Where
的自定义扩展方法,它返回满足条件的项的索引而不是返回原始项。
关于性能方面的讨论中提到,LINQ2Objects提供程序是否能够优化掉其中一次迭代,需要深入了解LINQ的工作原理。
本文讨论了如何在单个步骤中获取列表中某个项的索引。提供了使用List.FindIndex
方法和使用Select
方法的解决方法。还提到了自定义扩展方法以及关于LINQ的工作原理的讨论。