【问题标题】:Strange error on stringed Linq calls字符串 Linq 调用的奇怪错误
【发布时间】:2013-08-05 13:32:01
【问题描述】:

我继承了这段代码,它接受一个 IEnumerable 并对其执行一系列选择,然后在执行选择后尝试对剩余记录调用 Sum。代码如下:

var totalrecs = records.Select(row => new RowInfo(RowID = row.RowID, SomeData = row.SomeData})
.Select(ri => new {RowInfo = ri, XMLData = GetXMLFileForRecord(ri)})
.Select(data => ParseAndUpdateRecords(data.RowInfo, data.XmlData))
.Sum();

其中“记录”是一个 IEnumerable。

错误是尝试将小数转换为长整数,并且在调用三个 Select 调用产生的迭代器上的 Sum 时似乎发生了 StackTrace。

堆栈跟踪是:

Exception:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot implicitly convert type 'decimal' to 'long'. An explicit conversion exists (are you missing a cast?)
at CallSite.Target(Closure , CallSite , Object )
at RecordCapture.Controller.<CaptureAndUpdateRecords>b__10(Object row)
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x)
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Sum(IEnumerable`1 source)
at RecordCapture.Controller.CaptureAndUpdateRecords()
at RecordCapture.Controller.<Start>b__1() 
StackTrace:   at CallSite.Target(Closure , CallSite , Object )
at RosterCapture.Controller.<CaptureAndUpdateRosters>b__10(Object row)
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x)
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Sum(IEnumerable`1 source)
at RecordCapture.Controller.CaptureAndUpdateRecords()
at RecordCapture.Controller.<Start>b__1()

Selects 返回一个 Iterator,似乎没有任何方法可以准确计算 Selects 的结果。

有趣的是,如果 records 为空,调用 Sum 只会返回一个零并且不会引发错误。

【问题讨论】:

  • 如果你想要计数,你可以调用 .Count() 而不是 .Sum()

标签: iterator sum ienumerable


【解决方案1】:

您想对整数或小数求和吗?使用适当的通用类型,并在必要时转换结果。重载列表见http://msdn.microsoft.com/en-us/library/system.linq.enumerable.sum.aspx

【讨论】:

  • 在我给出的示例中,Sum 在迭代器上被调用。您提供的链接是在一个简单的整数列表上进行的。我不明白这有什么帮助。您能否在我提供的代码中给出一个可靠的示例来说明您将如何做到这一点?
  • Sum 表示您正在获取某种类型的数值的 Enumerable,并将它们加在一起。可以这么说,您不能对“迭代器”求和。您要求和的值的类型是什么?如果答案不是数字类型,那么您的代码并没有像您认为的那样做。
【解决方案2】:

我想通了。堆栈跟踪具有误导性。

问题在于在我的代码中构建 RowInfo 对象... RowID 很长,并且该属性将其值设置为的变量是小数。

我认为 Sum 调用中发生错误是因为延迟加载,在该调用进行并且需要数据之前没有完成属性设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多