将 LINQ 查询传递给 select 动态表单集合的方法

Pass LINQ query to method to select dynamically form collection

我已经在 SO 上查看了这个问题,但找不到解决我的问题的方法。

在我的程序中有一个 class,其唯一原因是 select 从通过构造函数传递给它的数据集合中获取数据。 我需要做的是将 LINQ 查询从所述数据传递到 selecting 方法到 select。但是我没有运气解决我的问题。 这是代码:

public class ServiceClient<TInput>
{
    private readonly IEnumerable<TInput> data;

    public ServiceClient(IEnumerable<TInput> dataInput)
    {
        this.data = dataInput;
    }

    public TResult Send<TResult>(Func<IEnumerable<TInput>, TResult> selector)
    {
        var selectedData = this.data.Select(selector); // How to do the selection here???

        // ...
    }
}

class是这样调用的:

private static void Main(string[] args)
{
    var persons = new List<Person>
    {
        new Person { Id = 0, FamilyId = 0 },
        new Person { Id = 1, FamilyId = 0 },
        new Person { Id = 2, FamilyId = 1 }
    };

    var func = new Func<IEnumerable<Person>, Person>(Target);

    var client = new ServiceClient<Person>(persons);

    client.Send(func);
}

private static Person Target(IEnumerable<Person> enumerable)
{
    return enumerable.SingleOrDefault(p => p.Id == 0);
}

替换:

var selectedData = this.data.Select(selector); 

与:

var selectedData = selector(this.data);

应该够了。 selector 是接受集合和 returns 单个元素的委托,因此您需要使用 data 参数调用 selector 委托。

如果您想像 this.data.Select(..) 一样使用 Select,您的 selector 代理应该像 Func<TInput, TResult> - 将一个元素投影到另一个元素的代理。

您需要更改发送方式:

public TResult Send<TResult>(Func<IEnumerable<TInput>, TResult> selector)
{
     return selector(data);
}