【问题标题】:Calling Linq.Min on same IEnumerable returns different result在同一个 IEnumerable 上调用 Linq.Min 返回不同的结果
【发布时间】:2015-02-13 10:16:02
【问题描述】:

我在调试时遇到了一件奇怪的事情,minmin2 返回不同的值,有什么原因吗?

[TestMethod]
public void TestGroupingOfTimesAndDistances()
{
    // arrange
    ...
    var routes = network.GetNetworkRoutes(startPoint, endPoints); // this yields one at a time

    // act
    routes.ToBandings();
}

public static bool ToBandings(this IEnumerable<INetworkRoute> enumerable)
{
    var min = enumerable.Min(nr => nr.Value.Distance);
    var min2 = enumerable.Min(nr => nr.Value.Distance);
    return true;
}

如果这很重要,我将从 MS Test Runner 运行此代码。框架 4.5,使用 VS 2013。

【问题讨论】:

  • 你能提供完整的代码来重现这个吗?
  • “来自数据库”并没有真正告诉我们太多。它是否已经被提取到List&lt;T&gt; 或类似的东西中?请给我们更多的背景。 一般而言您不能假设 IEnumerable&lt;T&gt; 每次迭代都会给您相同的结果,尽管对于许多实现来说都是如此。
  • 我要看的是,这两个调用是否都会产生一个数据库查询,如果是,那么查询是什么以及它会产生什么结果。
  • @Muhammad:嗯,在某些情况下,您可以期望答案是相同的 - 但这实际上取决于数据源。

标签: c# linq extension-methods ienumerable min


【解决方案1】:

如果enumerable 在调用之间发生变化,可能会发生这种情况。似乎GetNetworkRoutes 使用惰性求值来返回结果。这就是为什么每次调用Min 方法时都会枚举它的结果。所以第二个返回不同的结果,这就是为什么 min.你得到的价值是不同的。如果您想阻止这种情况,请使用ToListToArray 方法来实现结果。并将其传递给您的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多