【问题标题】:Linq FindAll and Where returns different resultsLinq FindAll 和 Where 返回不同的结果
【发布时间】:2012-07-24 03:56:25
【问题描述】:

我有两种不同类型的对象,它们的 ID 字段可能具有匹配的 ID。 FindAll 操作返回正确的非匹配对象,而 Where 操作返回所有对象。有人可以帮我理解为什么吗?

var _kenticoIDs = new HashSet<string>(_kenticoSessions.Select(p => p.AttendeeInteractiveSessionID));
var list = _aiSessionIDList.FindAll(p => !_kenticoIDs.Contains(p.SessionID));
var ienum = _aiSessionIDList.Where(p => !_kenticoIDs.Contains(p.SessionID));

编辑:如果我对 resultA 变量执行 .ToList() ,则结果列表与结果变量相同。但是,当我在 .ToList() 之前检查两个变量(result/resultA)时,一个有 6 个值,一个有 63 个值。我觉得我错过了一些明显的东西。

【问题讨论】:

  • 您的代码目前的格式非常糟糕,以至于无法阅读。请修复它。
  • 你是说_aiSessionIDList.Where(p =&gt; !_kenticoIDs.Contains(p.SessionID)) 会返回_aiSessionIDList 中的所有项目,即使列表中的项目的ID 不在_kenticoIDs 散列中?

标签: c# linq


【解决方案1】:

WhereFindAll 是等价的,只是在执行方面,Where 是延迟的,但FindAll 是立即的。

来源:This SO 线程。

【讨论】:

  • 我之前看过那个确切的问题并且看到了延迟执行,但错误地认为在调试器中检查它与按需操作相同。
  • 哦,好的。下一次,在处理 LINQ 变量时,请注意“延迟”执行上下文。一个很好的技巧是调用 'Count()' 方法来强制在 'Watch' 窗口中立即评估。
  • 是的,我觉得自己像个白痴。直到我执行 ToList() 时,我才意识到我没有做任何事情来实际评估结果集。
【解决方案2】:

我认为您遇到的问题是了解 Linq。 Where is a Linq extension method 而 FindAll 是一个 List 方法。 Linq 表达式在被枚举或转换为列表/数组之前不会被评估。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多