c# - LINQ 总和溢出异常?

标签 c# linq exception sum

我已经为 EventLogEntry 实现了自定义 IEqualityComparer。

public class EventLogEntryListComparison :
    IEqualityComparer<List<EventLogEntry>>,
    IEqualityComparer<EventLogEntry>

对于 IEqualityComparer<List<EventLogEntry>> ,GetHashCode函数非常简单。

public int GetHashCode(List<EventLogEntry> obj)
{
    return obj.Sum(entry => 23 * GetHashCode(entry));
}

但是,这会为某些条目抛出 OverflowException。

"Arithmetic operation resulted in an overflow."
   at System.Linq.Enumerable.Sum(IEnumerable`1 source)
   at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
   at <snip>.Diagnostics.EventLogAnalysis.EventLogEntryListComparison.GetHashCode(List`1 obj) in C:\dev\<snip>Diagnostics.EventLogAnalysis\EventLogEntryListComparison.cs:line 112
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)
   at <snip>.Diagnostics.EventLogAnalysis.Program.AnalyseMachine(String validMachineName) in C:\dev\<snip>.Diagnostics.EventLogAnalysis\Program.cs:line 104
   at System.Threading.Tasks.Parallel.<>c__DisplayClass2d`2.<ForEachWorker>b__23(Int32 i)
   at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()

在调试时尝试遇到相同的错误并且无法在即时窗口中出现后,我将代码更改为此并告别 OverflowException?

int total = 0;
foreach (var eventLogEntry in obj)
{
    total += GetHashCode(eventLogEntry);
}

return total;

LINQ 的 Sum 函数的行为有何不同?

编辑2

感谢一些评论,更正后的 GetHashCode 函数现在如下所示,

public int GetHashCode(List<EventLogEntry> obj)
{
    return unchecked(obj.Aggregate(17,
        (accumulate, entry) =>
        accumulate * 23 + GetHashCode(entry)));
}

最佳答案

LINQ 的 Enumerable.Sum(...) 方法在 checked block 内执行加法。这意味着如果总和溢出,他们会故意抛出异常。

你的总和不在 checked block 中,所以它是否抛出异常取决于......它是否是从 checked block 内部调用的,或者我相信集会上的属性(property)。

关于c# - LINQ 总和溢出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11033777/

相关文章:

c# - 调试 LINQ - 无法评估子项

c# - GroupBy 项目和项目的总数量

java - 如何循环遍历一个目录,获取所有文件名,然后在 Java 中获取这些文件的内容

java - 为什么在 Java 中使用 BufferStrategy 和 Swing Timer 时会出现空指针异常?

c# - 来自 AXIS 的 SOAP 操作错误

c# - Async WebRequest 卡住应用程序

c# - 你能解释一下这个 lambda 分组函数吗?

java - 捕获所有其他未预料到的异常

c# - 死锁c#解决方案

C# 遵守从​​ SQL 服务器中提取的字符串中的换行符