C# c无法转换匿名类型decimal?[]到十进制数组

C# c无法转换匿名类型decimal?[]到十进制数组,c#,C#,我已经实现了一个c linq表达式,它返回一个十进制可空数组。我基本上需要把它传递给一个接受十进制数组的函数 public static decimal? CompoundReturns(decimal[] rtns) { if (rtns.Length == 0) return null; return rtns.Aggregate((decimal)1, (acc, val) => acc * (1 + val)) - 1; } 我犯了一个错误 无法

我已经实现了一个c linq表达式,它返回一个十进制可空数组。我基本上需要把它传递给一个接受十进制数组的函数

public static decimal? CompoundReturns(decimal[] rtns)
{
    if (rtns.Length == 0)
        return null;

    return rtns.Aggregate((decimal)1, (acc, val) => acc * (1 + val)) - 1;
}
我犯了一个错误

无法转换匿名类型decimal?[]到十进制数组

当您调用new{x.Mtd}时,您正在指示编译器创建一个新的匿名类型,该类型作为一个名为Mtd的属性,它包含十进制值。当然,这不是十进制[],而是MyType[]

由于您似乎没有实际使用该匿名类型进行任何操作,因此只需返回十进制值本身,而不是匿名类型:

.Select(x => new { x.Mtd })
.Selectx=>x.Mtd

.Selectx=>new{x.Mtd}创建一个新的匿名对象。您只需要属性值:

.Select(x => x.Mtd)
如果Mtd可以为null,并且您希望过滤掉null值,请使用以下方法:

.Where(x => x.Mtd != null).Select(x => x.Mtd.Value).ToArray();

首先,您不需要匿名类型的集合:

.Select(x => new { x.Mtd })
您只需要小数:

.Select(x => x.Mtd)
而且,它还告诉你Mtd是十进制的,不是十进制的。前者不能直接转换为后者,因为前者支持后者不支持的值。i、 e.零

因此,当Mtd为空时,您需要定义一个默认值:

或者更改您的方法以接受十进制?[]:

请注意,在最后一种情况下,还需要更新方法以支持空值。例如,更改聚合调用中案例1的类型:


您必须进行两项更改:

首先删除匿名类型。然后选择

.Select( x=> x.Mtd ?? 0);
这将允许您在不更改当前方法的情况下将decimal[]作为参数传递

否则,您必须执行以下操作:

 .Select(x =x.Mtd) 
并将方法参数更改为具有可为空的十进制数组。
除了我之前的评论,也就是

假设x.Mtd是十进制的,那么只需删除新的{},即x=>x.Mtd.ToArray

不过,更大的问题是,数据库中有空索引,而实际上它不应该有空索引-在复合返回图表中的一段时间内,空索引性能的后果将是复合返回的灾难性后果-丢失的数据点将使所有未来的数据点无效

因此,真正的解决方案是在数据源中找到任何空数据点,并为它们提供正确的数据

然后更改从GetViewService返回的Dto上Mtd的数据类型

i、 e.不允许空值

那么,您的原始代码所需要做的就是删除匿名类投影,即

.Where(x => x.Mtd != null)
.Select(x => x.Mtd.Value)
.ToArray();

假设x.Mtd是decimal,那么只需删除新的{},即x=>x.Mtd.ToArrayI,正如您所说的那样,但是列表包含空值,因此返回decimal数组。现在,我收到的错误消息是无法转换十进制?这似乎很奇怪。你的意思是Mtd的数据类型是错误的吗?还是十进制[]RTN?如果只想将十进制转换为十进制?,则转换该值。过滤掉空值,然后强制转换。@Amy这正是我要输入的内容:但是检查null如何避免错误,因为我仍然在这个语句中得到编译时错误compoundReturnsBenchmark1Returns我像你说的那样做了,但是列表包含null值,因此返回十进制数组。现在,我收到的错误消息是无法转换十进制?如果我将方法更改为接受十进制,是否将[]更改为十进制[]?然后我在这行代码中得到错误,返回rtns.Aggregatedecimal1,acc,val=>acc*1+val-1;不能转换十进制?到decimal@Tom:因此,您需要决定是否支持空值。如果您愿意,所有代码都必须支持它们。您想支持空值吗?基本上,当交换复合返回时,我不需要传递可空列表。根据您的建议,只是为了让它编译,将方法更改为接受nullable值。在调试时,我可以看到值被传递,但方法返回null。为什么会这样?公众的双重身份?CompoundReturnsdouble?[]rtns{if rtns.Length==0返回null;返回rtns.Aggregatedouble?1,acc,val=>acc*1+val-1;}@Tom:因为您是从一个可为null的值开始的。Mtd是一个可为空的十进制数。在代码编译之前,不要试图更改关键字。从您想要实现的逻辑的角度来处理它。数据库可能会为该列返回空值。你想不想支持?数据库列是否应该不允许空值?在执行逻辑之前,查询是否应该过滤掉空值?逻辑应该支持空值吗?这是你的系统,你必须决定你想要它做什么。
.Select( x=> x.Mtd ?? 0);
 .Select(x =x.Mtd) 
 decimal? Mtd 
decimal Mtd
.Where(x => x.Mtd != null)
.Select(x => x.Mtd.Value)
.ToArray();