如何使用linq获取索引?我想通过FieldNo查找并返回索引。比如说,如果我搜索2,它应该返回索引1。
谢谢!
如何使用linq获取索引?我想通过FieldNo查找并返回索引。比如说,如果我搜索2,它应该返回索引1。
谢谢!
使用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;
Field field = Field.Where(x => x.FieldNo == 2).FirstOrDefault();
if (field != null)
{
Field.IndexOf(field);
}
overload
的.Select
。public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);
像这样:
List.Select((t, index) => t );
但我认为如果你的集合在内存中,这将起作用,否则会引发异常。