实现扩展方法来过滤IEnumerable <t>会产生一些错误

时间:2017-07-16 18:24:55

标签: c# generics ienumerable extension-methods

我对c sharp很新。为了掌握有关泛型,回调和扩展方法的想法,我已经完成了以下示例。我编写的扩展方法将在IEnumerable类型上运行并接受回调并且整数参数“year”。它将过滤掉IEnumerable并仅返回将通过测试的项目。但是在执行程序时我遇到了一些错误:

  

无法从中推断出扩展方法的类型参数   用法

     

并且对于扩展方法内的“返回项目”我收到错误   :不能隐式转换类型T到   System.Collections.Generic.IEnumerable。显式转换   存在。

class Program
{
    static void Main(string[] args)
    {
        List<Students> students = new List<Students>();

        students.Add(new Students("zami", 1991));

        students.Add(new Students("rahat", 2012));

        students.FilterYear((year) =>
        {
            List<Students> newList = new List<Students>();

            foreach (var s in students)
            {
                if (s.byear >= year)
                {
                    newList.Add(s);
                }
            }

            return newList;

        }, 1919);

    }
}

    public static class LinqExtend
    {
        public static IEnumerable<T> FilterYear<T>(this IEnumerable<T> source, Func<int, T> callback, int year)
        {
            var item = callback(year);

            return item;
        }
    }

    public class Students
    {
        public string name;

        public int byear;

        public Students(string name, int byear)
        {
            this.name = name;

            this.byear = byear;
        }
    }

1 个答案:

答案 0 :(得分:1)

基于它在OP中的使用方式,假设回调是假设返回枚举。

扩展方法也存在一个问题,即在给定函数的情况下返回单个T而不是IEnumerable<T>

更新扩展程序的回调Func<int, IEnumerable<T>> callback

public static class LinqExtend {
    public static IEnumerable<T> FilterYear<T>(this IEnumerable<T> source, Func<int, IEnumerable<T>> callback, int year) {
        var items = callback(year);
        return items;
    }
}

鉴于OP中的示例,您似乎也在重新发明已有的功能。

您可以使用LINQ Where来获得相同的结果。

var year = 1919;
var items = students.Where(s => s.byear >= year).ToList();