我试图找到索引如下。
但是以下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());
}
答案 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);
}