将LINQ查询传递给方法以选择动态表单集合

时间:2015-03-13 14:48:52

标签: c# linq expression func

我已经查询过关于SO的问题,但无法找到解决问题的方法。

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

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???

        // ...
    }
}

以这种方式调用该类:

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);
}

2 个答案:

答案 0 :(得分:4)

替换:

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

使用:

var selectedData = selector(this.data);

应该够了。 selector是加入集合并返回单个元素的委托,因此您需要使用selector参数调用data委托。

如果您想使用Select this.data.Select(..) selectorFunc<TInput, TResult>代表应该像{{1}} - 委托将一个元素投射到另一个元素中。

答案 1 :(得分:0)

您需要更改发送方式:

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