LINQ中的FindIndex扩展

时间:2017-12-17 18:24:20

标签: 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());
}

1 个答案:

答案 0 :(得分: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());
}

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);
}

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

注意:如果你真的想要源列表中的索引(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);
}