我有一个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();
}
任何可以帮助我构建这种方法的想法?
答案 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);
}