如何比较C#中相邻的双端队列元素?

时间:2019-10-01 10:41:28

标签: c# python loops porting deque

我正在尝试将一些代码从Python移植到C#。

目标是比较相邻的元素,看看四个连续的值是否大于彼此。

在这篇文章(Compare two adjacent elements in same list之后,我能够在 deque 上使用成对成功地比较相邻元素。< / p>

//In python
from more_itertools import pairwise

for x, y in pairwise(a_deque):
    if (x < y):
        i += 1
        if (i == 4)
            print("Hello world!")

问题在于 C#不包含 more_itertools 库,因此我目前正在寻找一种类似的技术来实现相同的解决方案。

仅供参考。双端队列的实现来自https://www.nuget.org/packages/Nito.Collections.Deque/

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

您可以这样自己实现python pairwise方法:

obj2

然后c#中的算法在结构上与python版本非常相似:

public static IEnumerable<(T, T)> Pairwise<T>(IEnumerable<T> collection)
{
    using (var enumerator = collection.GetEnumerator())
    {
        enumerator.MoveNext();
        var previous = enumerator.Current;
        while (enumerator.MoveNext())
        {
            yield return (previous, enumerator.Current);
            previous = enumerator.Current;
        }
    }
}

答案 1 :(得分:1)

只需创建函数:

contains

并使用它:

not

答案 2 :(得分:1)

有一个名为MoreLINQ的项目,它具有巧妙的LINQ扩展名。大多数情况下,由于LINQ的简单性,代码确实非常简单。您可以将其添加为NuGet程序包,也可以添加为仅添加所需操作符的单个源程序包。

Pairwise.cs实现了可以将函数应用于成对的元素的运算符:

int[] numbers = { 123, 456, 789 };
var result = numbers.Pairwise((a, b) => a + b);

源代码非常简单-检索一项,如果还没有结束,则检索另一项并应用函数:

    public static IEnumerable<TResult> Pairwise<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TSource, TResult> resultSelector)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));
        if (resultSelector == null) throw new ArgumentNullException(nameof(resultSelector));

        return _(); 

        IEnumerable<TResult> _()
        {
            using (var e = source.GetEnumerator())
            {
                if (!e.MoveNext())
                    yield break;

                var previous = e.Current;
                while (e.MoveNext())
                {
                    yield return resultSelector(previous, e.Current);
                    previous = e.Current;
                }
            }
        }
    }

唯一的“窍门”是使用名为... _

的本地迭代器函数。

您可以将Pairwise运算符作为仅用于2个项目的优化Window运算符。 还有另一个Window运算符,可以返回N个项目的序列。

此表达式:

var x=Enumerable.Range(1,5).Window(3);

产生以下数组:

{1,2,3}
{2,3,4}
{3,4,5}

答案 3 :(得分:-1)

您可以尝试这样:

for (int i = 0; i < arr.Length - 1; ++i)
{
    int a = arr[i];
    int b = arr[i + 1];
    Console.WriteLine($"{a} {b}");
}