我正在尝试将一些代码从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/
有什么建议吗?
答案 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}");
}