gpt4 book ai didi

c# - 奇怪的委托(delegate)引用行为

转载 作者:行者123 更新时间:2023-11-30 21:17:20 24 4
gpt4 key购买 nike

我需要将源函数(返回 IEnumerable )的结果传递给其他处理函数的列表(每个处理函数都接受并返回 IEnumerable )。

到目前为止一切都很好,但我还需要允许处理函数对其输入枚举执行多个循环。

所以不要传入 IEnumerable<T> ,我想我会把输入参数改成Func<IEnumerable<T>>并允许每个函数在需要时重新启动枚举。

不幸的是,我现在遇到堆栈溢出,最终处理函数调用自身而不是将请求传回链中。

示例代码有点做作,但希望能让您了解我要实现的目标。

class Program
{
public static void Main(string[] args)
{
Func<IEnumerable<String>> getResults = () => GetInputValues("A", 5);

List<String> valuesToAppend = new List<String>();

valuesToAppend.Add("B");
valuesToAppend.Add("C");

foreach (var item in valuesToAppend)
{
getResults = () => ProcessValues(() => getResults(),item);
}

foreach (var item in getResults())
{
Console.WriteLine(item);
}

}

public static IEnumerable<String> GetInputValues(String value, Int32 numValues)
{
for (int i = 0; i < numValues; i++)
{
yield return value;
}
}

public static IEnumerable<String> ProcessValues(Func<IEnumerable<String>> getInputValues, String appendValue)
{
foreach (var item in getInputValues())
{
yield return item + " " + appendValue;
}
}

}

最佳答案

getResults被捕获为一个变量,而不是一个值。我不太喜欢你在这里使用的整体方法(看起来很复杂),但你应该能够通过更改捕获来修复 stackoverflow:

    foreach (var item in valuesToAppend)
{
var tmp1 = getResults;
var tmp2 = item;
getResults = () => ProcessValues(() => tmp1(),tmp2);
}

旁注:IEnumerable[<T>]已经有点可重复,你只需调用foreach另一次 - 是 IEnumerator[<T>]那(尽管 Reset() )不是 - 而且,我认为值得尝试这样做 而无需 需要重复枚举,因为在一般情况下 根本不能保证有效。


这是具有相同结果的更简单的 (IMO) 实现:

using System;
using System.Collections.Generic;
using System.Linq;
class Program {
public static void Main() {
IEnumerable<String> getResults = Enumerable.Repeat("A", 5);
List<String> valuesToAppend = new List<String> { "B", "C" };
foreach (var item in valuesToAppend) {
string tmp = item;
getResults = getResults.Select(s => s + " " + tmp);
}
foreach (var item in getResults) {
Console.WriteLine(item);
}
}
}

关于c# - 奇怪的委托(delegate)引用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4849359/

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