gpt4 book ai didi

c# - 带有 AsParallel 的 IEnumerable 方法

转载 作者:行者123 更新时间:2023-11-30 22:12:42 25 4
gpt4 key购买 nike

我得到了以下扩展方法:

static class ExtensionMethods
{
public static IEnumerable<IEnumerable<T>> Subsequencise<T>(
this IEnumerable<T> input,
int subsequenceLength)
{
var enumerator = input.GetEnumerator();
SubsequenciseParameter parameter = new SubsequenciseParameter
{
Next = enumerator.MoveNext()
};

while (parameter.Next)
yield return getSubSequence(
enumerator,
subsequenceLength,
parameter);
}

private static IEnumerable<T> getSubSequence<T>(
IEnumerator<T> enumerator,
int subsequenceLength,
SubsequenciseParameter parameter)
{
do
{
lock (enumerator) // this lock makes it "work"
{ // removing this causes exceptions.
if (parameter.Next)
yield return enumerator.Current;
}

} while ((parameter.Next = enumerator.MoveNext())
&& --subsequenceLength > 0);
}

// Needed since you cant use out or ref in yield-return methods...
class SubsequenciseParameter
{
public bool Next { get; set; }
}
}

它的目的是将一个序列拆分成给定大小的子序列。

这样调用:

foreach (var sub in "abcdefghijklmnopqrstuvwxyz"
.Subsequencise(3)
.**AsParallel**()
.Select(sub =>new String(sub.ToArray()))
{
Console.WriteLine(sub);
}

Console.ReadKey();

有效,但是中间有一些空行,因为一些线程“太晚了”并进入第一个 yield 返回。

我尝试在各处放置更多的锁,但是我无法实现与 as 并行结合使这项工作正确。

很明显,这个例子根本不能证明 as parallel 的使用是合理的。它只是为了演示如何调用该方法。

最佳答案

问题是使用迭代器是延迟求值的,所以你返回一个延迟求值的迭代器,它被多个线程使用。

您可以通过如下重写您的方法来解决此问题:

public static IEnumerable<IEnumerable<T>> Subsequencise<T>(this IEnumerable<T> input, int subsequenceLength)
{
var syncObj = new object();
var enumerator = input.GetEnumerator();
if (!enumerator.MoveNext())
{
yield break;
}

List<T> currentList = new List<T> { enumerator.Current };
int length = 1;
while (enumerator.MoveNext())
{
if (length == subsequenceLength)
{
length = 0;
yield return currentList;
currentList = new List<T>();
}
currentList.Add(enumerator.Current);
++length;
}
yield return currentList;
}

这执行相同的功能,但不使用迭代器来实现“嵌套”IEnumerable<T> ,回避问题。请注意,这也避免了锁定以及自定义 SubsequenciseParameter类型。

关于c# - 带有 AsParallel 的 IEnumerable 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19575966/

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