Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq使用表达式选择属性_C#_Linq - Fatal编程技术网

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,您应该将属性选择器传递给
工作表
对象,而不是
元组
。您还可以使用simple
Func
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);
}