LINQ中的FindIndex扩展

cas*_*las 0 c# linq

我试图找到索引如下.

但是下面的LINQ说没有扩展FindIndex.

foreach (var distinctClassId in distinctClassIds)
{
    var indexes = classComponents.Where(x=> x.ClassId.Equals(distinctClassId)).
                  FindIndex(x => x.Id == Constants.Classes.ClassID.ToString() ||
                   x.Id == Constants.Courses.CoursesID.ToString());
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ogt 5

FindIndex()是一个实例方法List<T>.但是Where()返回一个IEnumerable<T>(或者可能IQueryable<T>取决于classComponents代码中的内容).

因此,您需要将该Where结果转换为列表才能调用FindIndex():

foreach (var distinctClassId in distinctClassIds)
{
    var indexes = classComponents.Where(x=> x.ClassId.Equals(distinctClassId)).ToList(). // here -> ToList()
                  FindIndex(x => x.Id == Constants.Classes.ClassID.ToString() ||
                   x.Id == Constants.Courses.CoursesID.ToString());
}
Run Code Online (Sandbox Code Playgroud)

FindIndex()只给出第一个匹配项的索引.调用您的变量indexes,因此您可能希望查找多个匹配项的索引.这可以通过使用为您提供索引的linq重载来完成:

foreach (var distinctClassId in distinctClassIds)
{
    var filtered = classComponents.Where(x=> x.ClassId.Equals(distinctClassId)).ToList();

    var indexes = filtered.Select((item, index) => new {item, index})
                          .Where(x => x.item.Id == Constants.Classes.ClassID.ToString() ||
                   x.item.Id == Constants.Courses.CoursesID.ToString())
                          .Select(x => x.index);
}
Run Code Online (Sandbox Code Playgroud)

这将创建包含项及其索引的匿名类型的对象,然后检查哪些项匹配并最终返回其索引.

注意:如果你真的想要源列表(classComponents)中的索引,你应该组合这样的Where语句:

foreach (var distinctClassId in distinctClassIds)
{
    var indexes = classComponents.Select((item, index) => new {item, index})
                    .Where(x => x.item.ClassId.Equals(distinctClassId) &&
                                (x.item.Id == Constants.Classes.ClassID.ToString() ||
                                 x.item.Id == Constants.Courses.CoursesID.ToString()))
                    .Select(x => x.index);
}
Run Code Online (Sandbox Code Playgroud)