我有一个'student'类型的对象列表(这是一个简单的例子)。
public class Student
{
string FirstName
string Surname
int Age
}
我想要的是获取一个列表,其中包含我列表中年龄为20岁的学生的索引号。我是否需要创建自定义扩展方法才能执行此操作?我知道我可以创建一个循环但是对于这种情况我不想。
public static class ExtensionMethods
{
public static IEnumerable<int> IndexsWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
int index = 0;
foreach (T element in source)
{
if (predicate(element))
yield return index;
}
index++;
}
}
List<int> test = stdList.IndexsWhere(std => std.Age == 7).ToList();
这返回一个两个整数的列表(这是正确的),但列表中的两个元素都是0而不是索引号2&amp; 5.我不确定我是否以正确的方式使用谓词?
答案 0 :(得分:2)
您的增量超出了循环范围。你需要把它移到里面。
foreach (T element in source)
{
if (predicate(element))
yield return index++;
}
答案 1 :(得分:1)
你错放了index++
。将其更改为:
foreach (T element in source)
{
if (predicate(element))
yield return index;
index++;
}
顺便说一下, 你可以选择与谓词匹配的索引:
var result = stdList.Select((x, index) => new {Index = index, Student = x})
.Where(x=> x.Student.Age == 7)
.Select(x => x.Index).ToList();
但是,为此目的最好使用扩展方法。