繁体   English   中英

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

[英]C# LINQ Expression as parameter for DataTable method

我有一个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();
}

有什么想法可以帮助我建立这种方法吗?

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

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

此外,我猜您的方法应该返回选择的结果,因此将其转换为返回TResult实例的方法(在您的情况下为GenericBudgetMatrixRow )。 最后但并非最不重要的一点是,无论如何在调用代码中ToList了对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();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM