C#LINQ表达式作为DataTable方法的参数

时间:2017-08-11 07:04:43

标签: c# linq generic-programming

我有一个LINQ表达式,我希望它变得通用:

public class GenericBudgetMatrix
    {
        public List<string> MatrixHeaders { set; get; }
        public List<GenericBudgetMatrixRow> MatrixRow { set; get; }
        public GenericBudgetMatrixRow MatrixFooterRow { set; get; }
    }

public class GenericBudgetMatrixRow
{
        public string EntityName { set; get; }
        public List<decimal> Values { set; get; }
        public decimal Total { set; get; }
}

GenericBudgetMatrix _genericBudgetMatrix = new GenericBudgetMatrix();

_genericBudgetMatrix.MatrixRow = _matrixTemplate.AsEnumerable().Select(r =>
                                    new GenericBudgetMatrixRow
                                    {
                                        EntityName = r.Field<string>(0),
                                        Values = r.ItemArray.Skip(1).Select(x => Convert.ToDecimal(x)).ToList(),
                                        Total = r.ItemArray.Skip(1).Select(x => Convert.ToDecimal(x)).Sum()
                                    }
                                    ).ToList();

我希望制作一个新方法来接受

r =>
     new GenericBudgetMatrixRow
     {
        EntityName = r.Field<string>(0),
        Values = r.ItemArray.Skip(1).Select(x => 
                    Convert.ToDecimal(x)).ToList(),
                    Total = r.ItemArray.Skip(1).Select(x => 
                     Convert.ToDecimal(x)).Sum()
                                        }

作为Func表达式参数。

这样的事情:

public void GenericMethod(Func<expression> predicate, DataTable _matrixTemplate)
{
    _matrixTemplate.AsEnumerable().Select(predicate).ToList();
}

任何可以帮助我构建这种方法的想法?

2 个答案:

答案 0 :(得分:2)

Select需要Func<T, TResult>,因此您应该将其作为参数提供给您的方法:

public void GenericMethod<T, TResult>(Func<T, TResult> predicate, DataTable _matrixTemplate)
{
    _matrixTemplate.AsEnumerable().Select(predicate).ToList();
}

此外,我猜您的方法应该返回您选择的结果,因此将其转换为返回TResult实例的方法(在您的情况下为GenericBudgetMatrixRow)。最后但并非最不重要的是,对ToList的调用已经过时了,因为你在调用代码中这样做了。因此,请返回IEnumerable<TResult>

public IEnumerable<TResult> GenericMethod<T, TResult>(Func<T, TResult> predicate, DataTable _matrixTemplate)
{
    return _matrixTemplate.AsEnumerable().Select(predicate);
}

现在你可以这样称呼它:

_genericBudgetMatrix.MatrixRow = GenericMethod(
    r => new GenericBudgetMatrixRow
        {
            EntityName = r.Field<string>(0),
            Values = r.ItemArray.Skip(1).Select(x => Convert.ToDecimal(x)).ToList(),
            Total = r.ItemArray.Skip(1).Select(x => Convert.ToDecimal(x)).Sum()
        }, 
    _matrixTemplate)
    .ToList();

答案 1 :(得分:0)

我已经找到了解决方案。这是由于通用类型

public IEnumerable<TResult> GenericMethod(Func<DataRow, TResult> predicate, DataTable _matrixTemplate)
{
    return _matrixTemplate.AsEnumerable().Select(predicate);
}