gpt4 book ai didi

c# - 将两个序列与其元素交错连接

转载 作者:行者123 更新时间:2023-11-30 22:54:55 26 4
gpt4 key购买 nike

我想连接两个序列的元素,生成一个包含原始两个序列的所有元素的单个序列,但它们的元素交错排列。

Concat LINQ 方法可以进行连接但没有交错,所以我需要一些特别的东西。

交错规则如下:

  • 对于每对元素,都应调用一个selector 函数,所选元素应该是第一个或第二个,具体取决于函数的boolean 结果(true:第一,false:第二)

这是我想要实现的实际示例:

var sequence1 = new int[] { 1, 2, 3 };
var sequence2 = new int[] { 11, 12, 13 };
var result = sequence1.ConcatInterleaved(sequence2, (a, b) => (a + b) % 3 == 0);
Console.WriteLine(String.Join("\r\n", result));

预期输出:

1  // Because (1 + 11) % 3 == 0, the first is selected
11 // Because (2 + 11) % 3 != 0, the second is selected
12 // Because (2 + 12) % 3 != 0, the second is selected
2 // Because (2 + 13) % 3 == 0, the first is selected
13 // Because (3 + 13) % 3 != 0, the second is selected
3 // Because sequence2 has no more elements, the next element of sequence1 is selected

我想要一个 LINQ 解决方案,以便本着内置 LINQ 方法的精神,可以延迟实际的串联。这是我目前的尝试:

public static IEnumerable<TSource> ConcatInterleaved<TSource>(
this IEnumerable<TSource> source,
IEnumerable<TSource> other,
Func<TSource, TSource, bool> selector)
{
// What to do?
}

更新:我更改了示例,因此它看起来不像是简单的交替交错。

关于selector 函数的澄清:这个函数不适用于两个序列的预选对,就像它发生在 Zip 中一样。方法。这些对不是预定义的。每次选择后都会形成一个新的对,其中包含先前选择的拒绝元素和先前选择的序列中的新元素。

例如,对于选择器 (a, b) => trueConcatInterleaved 等同于 Concat:返回 sequence1 的所有元素,后跟 sequence2 的所有元素。另一个示例:使用选择器 (a, b) => false 返回 sequence2 的所有元素,后跟 sequence1 的所有元素。

最佳答案

public static IEnumerable<T> Weave(
this IEnumerable<T> left,
IEnumerable<T> right,
Func<T, T, bool> chooser)
{
using(var leftEnum = left.GetEnumerator())
using(var rightEnum = right.GetEnumerator())
{
bool moreLeft = leftEnum.MoveNext;
bool moreRight = rightEnum.MoveNext;
while(moreLeft && moreRight)
{
if (chooser(leftEnum.Current, rightEnum.Current))
{
yield return leftEnum.Current;
moreLeft = leftEnum.MoveNext();
}
else
{
yield return rightEnum.Current;
moreRight = rightEnum.MoveNext();
}
}
// yield the buffered item, if any
if (moreLeft) yield return leftEnum.Current;
if (moreRight) yield return rightEnum.Current;

// yield any leftover elements
while (leftEnum.MoveNext()) yield return leftEnum.Current;
while (rightEnum.MoveNext()) yield return rightEnum.Current;
}
}

关于c# - 将两个序列与其元素交错连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55794997/

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