C# 使用Linq使用表达式选择属性
我有一个这样的物体:C# 使用Linq使用表达式选择属性,c#,linq,C#,Linq,我有一个这样的物体: public class Sheet { public decimal? Value1 { get; set; } public decimal? Value2 { get; set; } } 我有一个linq查询,它构建了元组的列表。int是存储在数据库中的百分比值。这可能是一个包装类,但为了简单起见,我使用了一个元组 然后我有一个扩展方法 public static decimal CalculateValue(this List<Tuple&l
public class Sheet
{
public decimal? Value1 { get; set; }
public decimal? Value2 { get; set; }
}
我有一个linq查询,它构建了元组的列表。int是存储在数据库中的百分比值。这可能是一个包装类,但为了简单起见,我使用了一个元组
然后我有一个扩展方法
public static decimal CalculateValue(this List<Tuple<int, Sheet>> sheets, Expression<Func<Tuple<int, Sheet>, decimal?>> field)
{
//return sum of int / 100 * field
}
public静态十进制CalculateValue(此列表页,表达式字段)
{
//返回int/100*字段的和
}
我想做的是调用类似这样的东西(使用linq从对象实际构建的列表)
List sheets=新列表();
var value1=表.CalculateValue(x=>x.value1);
var value2=表.计算值(x=>x.value2);
我不想使用反射。我不希望属性Value1
或Value2
使用“魔术”字符串。我的扩展方法是否可以使用表达式获取属性,然后将其乘以百分比,然后对整个集合的结果求和?根据您尝试构建的API,您应该将属性选择器传递给工作表
对象,而不是元组
。您还可以使用simpleFunc
delegate代替expression,因为您正在处理内存中的对象
不清楚如何处理空值-乘以空值毫无意义,因此我只使用零而不是空值(此类值不会影响总和):
公共静态十进制计算值(
此列表包括两张工作表(Func字段)
{
返回sheets.Sum(t=>t.Item1*字段(t.Item2).GetValueOrDefault()/100);
}
请记住-当您对两个整数应用除法运算符时,将使用。如果Item1
值小于100
,则此分区将生成0
。这就是为什么我把乘法运算符放在第一位。为什么要用表达式而不是简单的Func?
List<Tuple<int, Sheet>> sheets = new List<Tuple<int, Sheet>>();
var value1 = sheets.CalculateValue(x => x.Value1);
var value2 = sheets.CalculateValue(x => x.Value2);
public static decimal CalculateValue(
this List<Tuple<int, Sheet>> sheets, Func<Sheet, decimal?> field)
{
return sheets.Sum(t => t.Item1 * field(t.Item2).GetValueOrDefault() / 100);
}