如何跳过数组的每个第三个元素

时间:2019-04-04 13:21:10

标签: c# arrays

我需要以下代码的帮助。我有一个数组,该数组中的每个3元素跳过。该代码适用于数组的 indexes

带有-----的部分必须填充一些代码。

有人可以帮助我吗? 我有以下代码:

我尝试过这个。

static int[] SkipEvery(int[] numbers,int skip)
{
    int[] skipped = new int[numbers.Length];

    for (int i = 0; i < numbers.Length; i++)
    {
        if ((numbers[i]) % (skip + 1) == 0)
        {
            skipped[i] = numbers[i];
        }
        else
        {
            skipped[i] = numbers[i];
        }
    }
    return skipped;
}

public static void Main(string[] args)
{
    int[] numbers = new int[] { 7, 2, 24, 69, 101, 42, 84, 100, 72 };
    numbers = SkipEvery(numbers, 3);
}

输出必须为

[0]7   [1]2   [2]24   [3]-1    [4]101   [5]42   [6]84   [7]-1   [8]72

但是使用此代码,输出为

[0]7   [1]2   [2]24   [3]69    [4]101   [5]42   [6]84   [7]100   [8]72

4 个答案:

答案 0 :(得分:1)

您可以尝试使用 Linq 来过滤出项目并创建一个 new 数组:

  int[] numbers = new int[] { 7, 2, 24, 69, 101, 42, 84, 100, 72 };

  int[] skipped = numbers
    .Select((item, index) => (index + 1) % 4 != 0 ? item : -1)
    .ToArray();

如果您要修改 existing 数组,则只需执行一个简单循环即可

  for (int i = 3; i < numbers.Length; i += 4)
    numbers[i] = -1; 

最后,让我们看一下结果(skipped):

  string report = string.Join(" ", skipped
    .Select((item, index) => $"[{index}]{item}"));

  Console.Write(report);

结果:

  [0]7 [1]2 [2]24 [3]-1 [4]101 [5]42 [6]84 [7]-1 [8]72

编辑:您当前的代码已修改:

static int[] SkipEvery(int[] numbers, int skip) {
  int[] skipped = new int[numbers.Length];

  for (int i = 0; i < numbers.Length; i++) {
    if ((i + 1) % (skip + 1) == 0) { // check indexes - i, not values - numbers[i]
      skipped[i] = -1;               // well, you have to skip!   
    }
    else {
      skipped[i] = numbers[i];
    }
  }
  return skipped;
}

答案 1 :(得分:0)

尝试这样的事情:

if(i>=3 && i%3==0){continue;}

Modulus operator

答案 2 :(得分:0)

扩展方法如何:

public static class Extensions
{
    public static T[] ReplaceEvery<T>(this T[] values, int every, T replacement)
    {
        return values.Select( (x,i) => (((i+1)%every) == 0) ? replacement : x).ToArray();
    }
}

用法:

int[] numbers = new int[] { 7, 2, 24, 69, 101, 42, 84, 100, 72 };
var result = numbers.ReplaceEvery(3,-1);
Console.WriteLine(String.Join(",",result));
//output: 7,2,-1,69,101,-1,84,100,-1

答案 3 :(得分:0)

您可以跳过每个元素,并使用yield return将值返回给调用者。

static IEnumerable<int> SkipEvery(int[] numbers, int skip)
{
    for (int i = 1; i <= numbers.Length; i++)
    {
        if ((i % (skip + 1)) != 0)
            yield return numbers[i - 1];
        else
            yield return -1;
    }
}
static void Main(string[] args)
{
    int[] numbers = new int[] { 7, 2, 24, 69, 101, 42, 84, 100, 72 };
    string result = string.Join("\t", SkipEvery(numbers, 3).Select((x, i) => $"[{i}]{x}"));
    Console.WriteLine(result);
}

输出:

[0]7    [1]2    [2]24   [3]-1   [4]101  [5]42   [6]84   [7]-1   [8]72