首页 > 解决方案 > 自己编程的 LINQ 扩展方法

问题描述

好吧,我有这个扩展方法:

public static TSource First<TSource>(this IEnumerable<TSource> source)
{ 
    IList<TSource> list = source as IList<TSource>;
    return list[0];
}

这就是我所说的:

doubles.First()

doubles是一个带有双数的列表

现在我想对我的persons列表使用相同的扩展方法。这就是我想这样称呼它:

persons.First(x => x.Age < 60)

我应该返回 Age < 60 的第一个人。我必须在扩展方法的代码中进行哪些更改才能使其正常工作。由于这个错误,目前我无法编译:

CS1501: No overload for method 'First' takes 1 arguments

标签: c#.netvisual-studio

解决方案


您需要添加过滤器或谓词来完成您想要做的事情。

我创建了这个示例供您查看 https://dotnetfiddle.net/BnMktf


using System;
using System.Collections.Generic;
                    

public class Person
{
    public int Age {get; set; }
}

public class Program
{
    public static void Main()
    {
        var persons = new List<Person>();
        persons.Add(new Person() {Age = 60});
        persons.Add(new Person() {Age = 10});
        
        var result = persons.First(p => p.Age < 60);
        var resultWithoutParams = persons.First();
        Console.WriteLine(string.Format("This is the result {0}", result.Age));
        Console.WriteLine(string.Format("This is the result {0}", resultWithoutParams.Age));
    }
}

public static class Extensions {
    public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> filter = null)
    { 
        IList<TSource> list = source as IList<TSource>;
        if(filter == null)
            return list[0];
        
        foreach(var item in list) 
            if(filter(item)) return item;
        
        return default(TSource);
    }
}

此方法仅扩展列表,但不接受任何参数。


推荐阅读