C#查找符合条件的序列的相邻元素

时间:2018-12-04 23:40:26

标签: c#

所以我必须编写一个程序,用数字填充数组,然后找到相邻的偶数,例如(2,4,6等),然后将它们分类为一个序列,然后显示序列数和每个序列的元素 编辑:我所指的数字是0休息时除以2造成的误解。

示例

[1,2,2,3,4,6,9,3,2] it would display 2 sequences found and the contents are 2,2 and 4,6 (the last 2 was ignored because it isn't in a sequence)

这是我所做的,但我一直坚持下去

            Console.WriteLine("Enter the number of rows you'd like yo have ");
        int rows = Convert.ToInt32(Console.ReadLine());
        if (rows > 20 || rows < 3)
            throw new ArgumentException("this isn't right");
        List<int> numbers = new List<int>(rows);
        List<int> D = new List<int>();
        for (int i = 0; i < rows; i++)
        {
            Console.WriteLine("Enter the " + i + "Element:");
            numbers[i] = Convert.ToInt32(Console.ReadLine());
        }

        for (int i = 0; i < numbers.Count; i++)
        {
            if (numbers[i] % 2 == 0)
            {
                D.Add(numbers[i]);

            }

我当时在考虑有2个单独的列表1的对数和1的索引,但是没有用

3 个答案:

答案 0 :(得分:2)

一种方法是遍历数字,如果数字可以被2整除,则将其添加到临时列表中。如果不能被2整除,请检查您的临时列表中是否有多个项目,以及是否确实将该列表添加到了结果集中。然后清除其中的任何内容。

循环完成后,对临时列表再进行一次检查,并在必要时将其添加到结果集中。

首先,一个帮助程序函数通过允许用户传递以逗号分隔的值的单个条目来从用户那里获取数字列表:

private static List<int> GetListOfNumbers()
{
    Console.Write("Enter a comma-separated list of numbers: ");

    return Console.ReadLine()
        .Split(',')
        .Where(item => item.Trim().All(char.IsNumber))
        .Select(int.Parse)
        .ToList();
}

然后使用代码查找偶数集:

static void Main(string[] args)
{
    var numbers = GetListOfNumbers();
    var results = new List<List<int>>();
    var currentSet = new List<int>();

    foreach (var number in numbers)
    {
        if (number % 2 == 0)
        {
            currentSet.Add(number);
        }
        else
        {
            if (currentSet.Count > 1)
            {
                results.Add(currentSet);
            }

            currentSet = new List<int>();
        }
    }

    if (currentSet.Count > 1)
    {
        results.Add(currentSet.ToList());
    }

    Console.WriteLine("Results:");
    foreach (var setOfNumbers in results)
    {
        Console.WriteLine(string.Join(",", setOfNumbers));
    }

    Console.ReadLine();
}

输出

enter image description here

答案 1 :(得分:0)

如果您愿意使用MoreLINQ,则这是一种方法:

var inputData = new int[] { 1, 2, 2, 2, 3, 4, 6, 4, 8, 9, 3, 2 };

var wasEven = false;
var results = inputData.Segment(z =>
        {
            var isEven = z % 2 == 0;
            var result = isEven != wasEven;
            wasEven = isEven;
            return result;
        })
    .Where(z => z.Count() > 1 && z.First() % 2 == 0)
    .SelectMany(z => z).ToList();

Console.WriteLine(string.Join(",", results));

使用Segment可以将输入分成几部分,具体取决于该值是否与输入中的先前值相同even-ness。然后,Count()仅用于查看其中有多个条目的段,然后First用于确保该段包含偶数(而不是几率)。然后SelectManyToList将这些段重新连接在一起,成为一个列表。

答案 2 :(得分:0)

这与内置的LINQ运算符一起工作:

var numbers = new[] { 1, 2, 2, 2, 3, 4, 6, 4, 8, 9, 3, 2 };

var results = 
    numbers
        .Skip(1)
        .Aggregate(
            new[] { numbers.Take(1).ToList() }.ToList(),
            (a, n) =>
            {
                if (a.Last().Last() % 2 != n % 2)
                {
                    a.Add(new[] { n }.ToList());
                }
                else
                {
                    a.Last().Add(n);
                }
                return a;
            })
        .Where(x => x.Count > 1 && x.First() % 2 == 0)
        .ToList();

它给出2, 2, 24, 6, 4, 8