Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何借助Linq找出整数列表中特定模式的存在。C#_C#_Linq - Fatal编程技术网

如何借助Linq找出整数列表中特定模式的存在。C#

如何借助Linq找出整数列表中特定模式的存在。C#,c#,linq,C#,Linq,如何确定整数列表中的范围遵循特定的模式。 例如,我们有这样一个列表: List<int> ints = new List<int>(){4,5,2,6,8,4,5,6,5,6,8,9,9}; List ints=new List(){4,5,2,6,8,4,5,6,5,6,8,9}; 存在并且任何都可以检查元素是否满足特定条件 但是,如果我想知道行中是否有任何三项是增量值(加1):这里是{4,5,6},我会放弃LINQ要求。这很难,甚至不可能。常规的foreach语句

如何确定整数列表中的范围遵循特定的模式。 例如,我们有这样一个列表:

List<int> ints = new List<int>(){4,5,2,6,8,4,5,6,5,6,8,9,9};
List ints=new List(){4,5,2,6,8,4,5,6,5,6,8,9};
存在
并且
任何
都可以检查元素是否满足特定条件


但是,如果我想知道行中是否有任何三项是增量值(加1):这里是
{4,5,6}

,我会放弃LINQ要求。这很难,甚至不可能。常规的
foreach
语句更适合于此:

List<int> sequence = new List<int>();
List<int> longestSequence = null;
int previous = 0;
foreach (int i in ints)
{
    if (i != previous + 1 && sequence.Count > 0)
    {
        if (longestSequence == null || longestSequence.Count < sequence.Count)
        {
            longestSequence = sequence;
        }

        sequence = new List<int>();
    }

    sequence.Add(i);
    previous = i;
}
列表序列=新列表();
List longestSequence=null;
int-previous=0;
foreach(整数中的整数i)
{
如果(i!=previous+1&&sequence.Count>0)
{
if(longestSequence==null | | longestSequence.Count
你的问题有一个很好的解决方案,但是如果你真的在寻找LINQ唯一的方法,你可以使用
聚合

var inputs = new List<IEnumerable<int>>
{
    new List<int>{ 4,5,2,6,8,4,5,6,5,6,8,9,9 },
    new List<int>{ 1,2,3 },
    new List<int>{ 1,2,4 },
};

foreach(var input in inputs)
{
    var result = input.Aggregate(Enumerable.Empty<int>(), 
                    (agg, cur) => agg.Count() == 3 ? agg
                                    : agg.Any() && cur == agg.Last() + 1
                                        ? agg.Concat(new []{cur})
                                        : new []{cur});

    Console.WriteLine(result.Count() >= 3 ? String.Join(", ", result) : "not found");
}
var输入=新列表
{
新名单{4,5,2,6,8,4,5,6,5,6,8,9},
新名单{1,2,3},
新名单{1,2,4},
};
foreach(输入中的var输入)
{
var result=input.Aggregate(Enumerable.Empty(),
(agg,cur)=>agg.Count()==3?agg
:agg.Any()&&cur==agg.Last()+1
?聚集浓度(新[]{cur})
:新[]{cur});
Console.WriteLine(result.Count()>=3?String.Join(“,”,result):“未找到”);
}

另一种方法是选择所有3人组,然后查看哪些组符合您的n、n+1和n+2规则

var results = Enumerable.Range(0, ints.Count - 3)
            .Select(n => ints.Skip(n).Take(3).ToArray())
            .Where(three => three[0]+1 == three[1] && three[0]+2 == three[2])
            .ToArray();

为什么LINQ是一项要求?你可以尝试将正则表达式与LINQ混合使用,但这不是一个好主意,@Patrick answer更优雅简单。谢谢@Patric,你的解决方案清晰明了。然而,我只是在寻找linq解决方案。如果真的不可能,我会在一段时间后接受你的回答。很好,但你应该在它的范围内学习每一项技术,这种行为超出了LINQ的范围;)谢谢:)我想这是我能得到的最好的了。