使用自定义扩展方法获取列表中元素的索引

时间:2015-03-16 14:17:17

标签: c# .net

我有一个'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.我不确定我是否以正确的方式使用谓词?

2 个答案:

答案 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();

但是,为此目的最好使用扩展方法。