【问题标题】:Check if item position in array is even or odd (C#)检查数组中的项目位置是偶数还是奇数(C#)
【发布时间】:2023-04-11 05:15:01
【问题描述】:

我想要做的是,给定一个数组,选择列表中具有偶数/奇数索引的项目。

我会更好地解释:如果我有一个像 [1,4,6,2,8] 这样的数组,我想将所有具有 even position 的项目添加到列表 (evenList) 中(位置零、二、四等)。 ) 在数组中(在本例中为 1,6,8)。 奇数物品也一样。

我已经开发了以下代码,但我卡住了。

class CheckItem
{
    static readonly string myNumber = "5784230137691";

    static int[] firstTwelveList = new int[12];
    static int[] arrayEvenPosition = new int[(myNumber.Length / 2)];
    static int[] arrayOddPosition = new int[(myNumber.Length / 2)];

    static readonly int idx = 0;

    public static void Position()
    {
        firstTwelveList = myNumber.Substring(0, 12).Select(c => c - '0').ToArray();

        foreach (var even in firstTwelveList)
        {
            if(Array.IndexOf(firstTwelveList, idx) % 2 == 0) //never enter here...
            {
                Array.Copy(firstTwelveList, arrayEvenPosition, (myNumber.Length / 2));
            }
        }
        Console.ReadLine();
    }
}

我期望arrayEvenPosition 将包含5,8,2,0,3,6,1arrayOddPosition 7,4,3,1,7,9

【问题讨论】:

  • 您是否已使用调试器进行调试?你发现了什么?另外,为什么都是静态成员?
  • 卡住是什么意思;能具体点吗?
  • 试试 Linqvar result source.Where((item, index) => index % 2 == 0).ToArray();
  • @maccettura 使用调试器我发现它不执行 IndexOf() 语句
  • @Link 那为什么?如果您从未进入 foreach 循环,那么您可能没有什么可循环的...firstTwelveList 的价值是什么?

标签: c# arrays indexing position


【解决方案1】:

试试Linq

 firstTwelveList = myNumber
   .Take(12)
   .Select(c => c - '0')
   .ToArray();

 arrayEvenPosition = firstTwelveList
   .Where((item, index) => index % 2 == 0)
   .ToArray();

 arrayOddPosition = firstTwelveList
   .Where((item, index) => index % 2 != 0)
   .ToArray();

【讨论】:

  • 在 OP 代码中有很多奇怪的事情需要解决,可能想提一些来帮助他们...
  • 符号 == 和 != 不是倒过来表示奇数和偶数吗?
  • @Link:这取决于您要处理数组one-based 还是zero-based。如果是从零开始的数组,我们应该反转条件,你是对的
【解决方案2】:

我认为对于您的任务,for 循环的基本形式比 foreach 更好。

int j=0;
int k=0;
for (int i=0; i<firstTwelveList.Length; i++) {
  if (i % 2 == 0) {
     arrayEvenPosition[j++] = firstTwelveList[i];
  } else {
     arrayOddPosition[k++] = firstTwelveList[i];
  }
}

请注意,我的代码不是一个完整的解决方案,而只是您应该做什么的一个想法。 祝你好运!

【讨论】:

    【解决方案3】:

    其他答案是正确的,有更简单的方法可以根据索引 (odd /even) 将数组拆分为两个数组。但是我注意到您的代码存在两个问题。

    if(Array.IndexOf(firstTwelveList, idx) % 2 == 0) //never enter here..
    

    IndexOf 的两个参数是数组和要查找元素索引的项目,idx 不是正确的参数。它应该是 foreach 循环中的 even 变量

    其次,将正确的值复制到另一个数组时,您将第一个数组的前 6 个字符复制到新数组。

    引用Array.Copy(Array, Array, Int32) 的参考文档,它只是将所需的元素范围从第一个数组复制到第二个数组。

    所以你需要修改代码来复制满足偶/奇条件的元素。为此,您需要一个变量来跟踪新数组的当前索引

    整个类都可以这样修改

    class CheckItem
    {
        static readonly string myNumber = "5784230137691";
    
        static int[] firstTwelveList = new int[12];
        static int[] arrayEvenPosition = new int[(myNumber.Length / 2)];
        static int[] arrayOddPosition = new int[(myNumber.Length / 2)];
    
        static int idx = 0;
        static int evenIdx = 0; // track current index of new array
    
        public static void Position()
        {
            firstTwelveList = myNumber.Substring(0, 12).Select(c => c - '0').ToArray();
    
            foreach (var even in firstTwelveList)
            {
                if (Array.IndexOf(firstTwelveList, even) % 2 == 0) // replace idx with even...
                {
                    Array.Copy(firstTwelveList, idx, arrayEvenPosition, evenIdx, 1); // copy the element from the current index of first array to new array
                    evenIdx++;
                }
                idx++;
            }
            Console.ReadLine();
        }
    }
    

    【讨论】:

    • 或者只使用数组[index] 并分配单个元素。 Array.Copy 肯定是矫枉过正
    猜你喜欢
    • 2011-11-12
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2015-03-03
    • 1970-01-01
    • 2023-01-20
    • 2010-09-14
    相关资源
    最近更新 更多