我试图找到索引如下.
但是下面的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)
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)
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |