gpt4 book ai didi

c# - IEnumerable 项目在使用 LINQ Where 使用之前消失

转载 作者:行者123 更新时间:2023-11-30 17:34:36 26 4
gpt4 key购买 nike

我对编程还很陌生,我一直在尝试编写一些随机函数。

我编写了以下函数,它基于埃拉托色尼筛法松散地工作。不过最初,我遇到了 updatedEntries IEnumerable 的问题。

updatedEntites 有点填充(我收集到与延迟执行有关的东西 - 在 Debug模式下,'current' 为 null 但结果 View 包含相关项目)但是当 RemoveWhere 应用于 oddPrimesAndMultiples 时,updatedEntries 中的项目消失了尽管我不明白为什么它们仍应链接到 oddPrimesAndMultiples 中的项目。 (当然,我可能完全误解了发生的事情,问题可能完全是另外一回事!)

如果我将 updatedEntries 更改为 List 而不是 IEnumerable,则不会出现问题,实际上我现在重写了该语句而不使用 LINQ(可能?)更好地利用我正在使用 SortedSet 的事实...但我仍然想知道问题最初出现的原因!

这是我的代码:

public static IEnumerable<int> QuickPrimes()
{
int firstPrime = 2;
int firstOddPrime = 3;

int currentValue = firstOddPrime;
int currentMinimumMultiple;

SortedSet<Tuple<int, int>> oddPrimesAndMultiples = new SortedSet<Tuple<int, int>>() { new Tuple<int, int> (firstOddPrime, firstOddPrime) };
IEnumerable<Tuple<int, int>> updatedEntries;

yield return firstPrime;
yield return firstOddPrime;

while (true)
{
currentMinimumMultiple = oddPrimesAndMultiples.First().Item1;
while (currentValue < currentMinimumMultiple)
{
yield return currentValue;
oddPrimesAndMultiples.Add(new Tuple<int, int> (currentValue * 3, currentValue));
currentValue += 2;
}

updatedEntries = oddPrimesAndMultiples.Where(tuple => tuple.Item1 == currentMinimumMultiple)
.Select(t => new Tuple<int, int>(t.Item1 + 2 * t.Item2, t.Item2));

oddPrimesAndMultiples.RemoveWhere(t => t.Item1 == currentMinimumMultiple);
oddPrimesAndMultiples.UnionWith(updatedEntries);
currentValue += 2;
}
}

以及我正在测试功能的主要位置:

static void Main(string[] args)
{
foreach(int prime in Problems.QuickPrimes())
{
Console.WriteLine(prime);
if (prime > 20) return;
}
}

非常感谢!

最佳答案

陷阱是 updatedEntries 定义在一行中,但实际上 执行 之后。

要回到基础,请参阅此代码片段(来自 Linqpad):

var ints = new SortedSet<int>( new[] { 1,2,3,4,5,6,7,8,9,10});

var updatedEntries = ints.Where(i => i > 5); // No ToList()!
updatedEntries.Dump();

这显示 6, 7, 8, 9, 10

ints.RemoveWhere(i => i > 7);
updatedEntries.Dump();

现在显示 6, 7,因为 updatedEntries 被重新执行。

ints.UnionWith(updatedEntries);

这会添加 6, 7,而您希望它添加第一个列表 6, 7, 8, 9, 10

因此,在定义 IEnumerable 时,您应该始终知道它实际执行的时间。它始终作用于该特定点的程序状态。

关于c# - IEnumerable 项目在使用 LINQ Where 使用之前消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42170754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com