使用LINQ在列表中查找索引

6

如何使用linq获取索引?我想通过FieldNo查找并返回索引。比如说,如果我搜索2,它应该返回索引1。

enter image description here

谢谢!

3个回答

9

使用LINQ:

int index = fields.Select((f, i) => new { Field = f, Index = i})
    .Where(x => x.Field.FieldNo == 2)
    .Select(x => x.Index)
    .DefaultIfEmpty(-1)
    .First();

不使用LINQ,而是使用List.FindIndex更易读、高效,并且适用于.NET 2

int index = fields.FindIndex(f => f.FieldNo == 2);

上述代码使用了匿名类型,它们是GC堆分配的,可能会导致性能问题。因此,如果您正在使用.NET Core或.NET Framework 4.7或更高版本,我们应该改用ValueTuple,以避免完全使用堆,以实现最大的性能:

int index = fields
    .Select((f, idx) => (f, idx))
    .Where(t => t.f.FieldNo == 2)
    .Select(t => t.idx)
    .DefaultIfEmpty(-1)
    .First();

或者使用FirstOrDefault和Elvis运算符更简洁:

int index = fields
    .Select((f, idx) => (f, idx))
    .FirstOrDefault(t => t.f.FieldNo == 2)
    ?.idx ?? -1;

0
如果我理解您的问题正确,这就是您需要的内容:
Field field = Field.Where(x => x.FieldNo == 2).FirstOrDefault();
if (field != null)
    {
        Field.IndexOf(field);
    }

这样做非常低效,它需要两次遍历列表,并且在第二次运行中不必要地将每个项目与已经在第一次运行中找到的值进行比较。 - O. R. Mapper

0
我觉得你可以使用这个overload.Select
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);

像这样:

List.Select((t, index) => t );

但我认为如果你的集合在内存中,这将起作用,否则会引发异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接