LINQ中的FindIndex扩展

问题描述 投票:0回答:1

我试图找到索引如下。

但是下面的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());
}
c# linq
1个回答
5
投票

FindIndex()List<T>的实例方法。但Where()返回IEnumerable<T>(或者可能是IQueryable<T>,取决于你的代码中的classComponents)。

所以你需要将Where结果转换为list才能调用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);
}
© www.soinside.com 2019 - 2024. All rights reserved.