gpt4 book ai didi

linq - 使用Linq在列表中查找连续项

转载 作者:行者123 更新时间:2023-12-04 17:03:57 24 4
gpt4 key购买 nike

说我有以下整数数组:

int[] numbers = { 1, 6, 4, 10, 9, 12, 15, 17, 8, 3, 20, 21, 2, 23, 25, 27, 5, 67,33, 13, 8, 12, 41, 5 };

我如何编写一个Linq查询来查找3个大于10的 连续元素?另外,如果我可以指定我要说的是此类元素的第一,第二,第三等组,那就太好了。

例如,Linq查询应该能够识别:
12,15,17作为第一组连续元素
第二组23,25,27
第三组67、33、13

如果我指定我要由3个连续元素组成的第二组,则查询应返回第二组。

谢谢。

最佳答案

更新:尽管从技术上讲,帕特里克(Patrick)在注释中不是“linq查询”,但是该解决方案是可重用,灵活且通用的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication32
{
class Program
{
static void Main(string[] args)
{
int[] numbers = { 1, 6, 4, 10, 9, 12, 15, 17, 8, 3, 20, 21, 2, 23, 25, 27, 5, 67,33, 13, 8, 12, 41, 5 };

var consecutiveGroups = numbers.FindConsecutiveGroups((x) => x > 10, 3);

foreach (var group in consecutiveGroups)
{
Console.WriteLine(String.Join(",", group));
}
}
}

public static class Extensions
{
public static IEnumerable<IEnumerable<T>> FindConsecutiveGroups<T>(this IEnumerable<T> sequence, Predicate<T> predicate, int count)
{
IEnumerable<T> current = sequence;

while (current.Count() > count)
{
IEnumerable<T> window = current.Take(count);

if (window.Where(x => predicate(x)).Count() >= count)
yield return window;

current = current.Skip(1);
}
}
}
}

输出:
12,15,17
23,25,27
67,33,13

要获得第二组,请更改:
var consecutiveGroups = numbers.FindConsecutiveGroups((x) => x > 10, 3);

到:
var consecutiveGroups = numbers.FindConsecutiveGroups((x) => x > 10, 3).Skip(1).Take(1);

更新2 在我们的生产使用中进行了调整之后,随着numbers数组中项目数的增加,下面的实现要快得多。
public static IEnumerable<IEnumerable<T>> FindConsecutiveGroups<T>(this IEnumerable<T> sequence, Predicate<T> predicate, int sequenceSize)
{
IEnumerable<T> window = Enumerable.Empty<T>();

int count = 0;

foreach (var item in sequence)
{
if (predicate(item))
{
window = window.Concat(Enumerable.Repeat(item, 1));
count++;

if (count == sequenceSize)
{
yield return window;
window = window.Skip(1);
count--;
}
}
else
{
count = 0;
window = Enumerable.Empty<T>();
}
}
}

关于linq - 使用Linq在列表中查找连续项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112435/

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