List< T>.查找多个结果的索引
本文关键字:结果 索引 查找 List | 更新日期: 2023-09-27 17:50:44
比如说,我们有一个List
List<int> lst = new List<int>();
lst.Add(20);
lst.Add(10);
lst.Add(30);
lst.Add(10);
lst.Add(90);
如果我需要得到第一个元素的索引值是20,我将使用
FindIndex()
但是是否有一种方法可以用于多个结果?假设我想要得到数字为10的元素的索引。
我知道有一个方法FindAll(),但这给了我一个新的列表,而不是索引。
最好的(?)方法是获取索引数组。
下面代码的最大缺点是它使用-1作为幻数,但对于索引来说,它是无害的。
var indexes = lst.Select((element, index) => element == 10 ? index : -1).
Where(i => i >= 0).
ToArray();
一个可能的解决方案是:
var indexes = lst.Select((item, index) => new { Item = item, Index = index })
.Where(v => v.Item == 10)
.Select(v => v.Index)
.ToArray();
首先选择所有项目及其索引,然后对项目进行筛选,最后选择索引
更新:如果你想封装我或夏娃的解决方案,你可以使用像
这样的东西public static class ListExtener
{
public static List<int> FindAllIndexes<T>(this List<T> source, T value)
{
return source.Select((item, index) => new { Item = item, Index = index })
.Where(v => v.Item.Equals(value))
.Select(v => v.Index)
.ToList();
}
}
然后你可以这样写:
List<int> lst = new List<int>();
lst.Add(20);
lst.Add(10);
lst.Add(30);
lst.Add(10);
lst.Add(90);
lst.FindAllIndexes(10)
.ForEach(i => Console.WriteLine(i));
Console.ReadLine();
只是给出另一个解决方案:
Enumerable.Range(0, lst.Count).Where(i => lst[i] == 10)
当然它也可以是一个扩展方法:
public static IEnumerable<int> FindAllIndices<T>(this IList<T> source, T value)
{
return Enumerable.Range(0, source.Count)
.Where(i => EqualityComparer<T>.Default.Equals(source[i], value));
}