LINQ Sum 溢出异常?

2023-11-24

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

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

For 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 函数的行为有何不同?

Edit 2

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

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

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

您的总和不在 a 内checked块,所以它是否抛出异常取决于......它是否是从内部调用的checked块,或者我认为是程序集上的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ Sum 溢出异常? 的相关文章

随机推荐

  • 在 OpenGL/GLFW 3.2 中在窗口和全屏之间切换

    我正在 Linux 上学习 OpenGL 但无法进行模式切换 窗口切换到全屏并返回 该窗口似乎正在全屏显示 但看起来不正确 要切换模式 将创建一个新窗口并销毁旧窗口 void OpenGLWindow FullScreen bool ful
  • 使用 PyQt5 设置 IPython Qtconsole

    在 OSX 10 9 上 我安装了 Qt5 后来我安装了 Ipython sip 和 PyQt5 全部都是从源代码构建的 现在问题是 当我尝试运行时ipython qtconsole 我有一堆与该目录 及其子文件夹 中的文件相关的错误 Li
  • activerecord 中的子查询

    使用 SQL 我可以轻松地执行这样的子查询 User where id gt Account where select user id 这会产生 SELECT FROM users WHERE id IN SELECT user id FR
  • 如何告诉 MongoDB C# 驱动程序以字符串格式存储所有 Guid?

    我目前正在申请 BsonRepresentation BsonType String 归属于所有人Guid我的域模型中的属性以使这些属性以字符串格式序列化 除了做起来很烦人之外 有时这也行不通 例如与定制Wrapper
  • 包含 count 和 case 语句的 SQL 查询

    我需要找出有多少人在 3 个不同年份 2006 年 2007 年 2008 年 的报税期结束日期 fpe 的 60 天内 120 天内 180 天内 180 天内提交了 fil dt 纳税申报表 下面的陈述将给我所有的岁月 我需要对每年和每
  • Python中如何进行封装?

    这有什么问题吗 从客观和功能的角度来看 import sys class EncapsulationClass object def init self self privates dict privates protected a sel
  • 需要一个公式:从 0001 年 1 月 1 日 12:00 AM 以来的秒数中提取年份

    输入 自 0001 年 1 月 1 日以来的秒数 输出 该时间段内的整年数 我开发了一种我认为不是最佳解决方案的算法 我认为应该有一个不涉及循环的解决方案 请参阅代码块 1 了解算法 该算法 A 确定天数 B 根据闰年从天总数中迭代减去 3
  • NHibernate - 执行 SQL 来填充 DTO

    我有一些报告实例 其中执行存储过程比复杂的 QueryOver 语句更容易 更简单 我有一个 DTO 而不是一个实体 它表示从查询返回的数据 并希望将查询结果填充到 DTO 中 我正在使用命名查询和 session GetNamedQuer
  • 在 iOS 中对包含字母数字单词的数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个包含 10 个元素的数组 称为 products 默认情况下已排序 这是现在的当前日志 for int i 0 i
  • 如何将包含撇号的语句插入Sqlite数据库

    在我的 iPhone 应用程序中 我使用 Sqlite 数据库 我需要将文本存储在数据库中 文本包含撇号 例如 Insert into tbl insert values It is Steve s Shirt 如何将此类语句存储在Sqli
  • F# 中的策略模式

    在 C 中 我有以下代码 public class SomeKindaWorker public double Work Strategy strat int i 4 some code var s strat Step1 i some m
  • 如何让自定义元素在 Firefox 中工作?

    我有这个基本的自定义元素示例 它可以在 Chrome 中运行 但不能在 Firefox 中运行 有没有办法让它在 Firefox 中工作 没有聚合物 但可能是某种填充 我还启用了dom webcomponents enabled标记没有任何
  • 如何在没有 USB 连接的情况下在手机睡眠模式下调试 Android 应用程序

    我想这很棘手 通过 USB 连接 用于调试 和拔出 USB 时 手机的行为有所不同 不同之处在于睡眠模式 使用 USB 连接的手机似乎更活跃且响应更快 而没有 则更少 例如 我有一个闹钟来唤醒手机并调节音量 连接时 在睡眠状态下工作正常 每
  • 懒惰的、广度优先的一元玫瑰树展开是否可能?

    Data Tree包括unfoldTreeM BF and unfoldForestM BF使用单子操作的结果来广度优先构造树的函数 树展开器可以使用森林展开器轻松编写 因此我将重点关注后者 unfoldForestM BF Monad m
  • 将纬度和经度转换为 esri arcGIS MapPoint

    我在将纬度和经度值转换为 android esri arcGIS 地图点时遇到问题 这是我从 GPS 坐标获取纬度和经度值的代码 LocationManager lm String towers double lat double long
  • 如何在jsdoc中描述“对象”参数?

    My function does X and Y params object parameters An object containing the parameters params function callback The callb
  • 加载 EntityFramework 4.3.1 时出错

    我用 C 创建了一个 MVC 应用程序 我在我的解决方案中创建了一个名为 PhoneDomain 的新项目 这样做的目的是将我的数据和领域层与实际问题分开 我右键单击该项目并转到 添加库包引用 然后尝试添加 EntityFramework
  • 如何在 Angular 2 中将字符串的特定部分加粗

    我有一个 HTML 代码如下 div class row div class col 12 style margin top 15px margin bottom 10px description translate div div 我在用
  • 通过 Spark groupBy dataframe 查找时间戳的最小值

    当我尝试将数据框分组到列上时 尝试找到每个分组的最小值groupbyDatafram min timestampCol 看来我无法在非数字列上执行此操作 那么如何正确过滤 groupby 上的最小 最早 日期呢 我正在从 postgresq
  • LINQ Sum 溢出异常?

    我已经为 EventLogEntry 实现了自定义 IEqualityComparer public class EventLogEntryListComparison IEqualityComparer