【问题标题】:Check if all elements in an array are equal检查数组中的所有元素是否相等
【发布时间】:2014-04-17 08:43:42
【问题描述】:

在第一部分中,我用数组元素创建了对,数组的长度是原来的两倍。数组总是偶数。

这是第一部分:

using System;

class Program
{
static void Main()
{
    int[] Arr = new int[]{1, 2, 0, 3, 4, -1};
    int[] newArr = new int[(Arr.Length / 2)];

    int sum = 0;

    for (int i = 0; i < Arr.Length; i+=2)
    {
        if (i + 1 < Arr.Length)
        {
            newArr[sum] = Arr[i] + Arr[i + 1];
        }
        else
        {
            newArr[sum] = Arr[i];
        }
        sum++;
    }

在第二部分中,我想检查数组元素是否相等。我想要做的是每次 for 循环中的索引等于数组中的下一个索引时递增 int 计数器。

第二部分我有什么:

int counter = 0;
    for (int i = 0; i < newArr.Length -1; i++)
    {
        if (newArr[i] == newArr[i + 1])
        {
            counter++;
        }
        else
        {
            Console.Write(" ");
        }
    }

这段代码有什么问题。我似乎无法理解如何编写适用于 int Arr[5] 和 int Arr[5000] 的代码

【问题讨论】:

  • i &lt; newArr.Length - 1
  • 现在我明白了我在 Visual Studio 中遇到的异常
  • i等于newArr.Length - 1时它会在newArr[i + 1]崩溃,你应该从0迭代到&lt; newArr.Length-1
  • 如果你可以使用 linq,检查所有数组元素是否相等的最短方法是写 newArr.All(a => a == newArr[0]);

标签: c# arrays if-statement for-loop


【解决方案1】:

您只需将for 循环中的终止条件更改为

i < newArr.Length - 1

这样您就可以将array[i]array[i + 1] 进行比较。此更改可确保您不会超出数组的上限。

【讨论】:

    【解决方案2】:

    试试这个

    for ( i=1;i<arr.Length;i++)
    {
        if(arr[0]==arr[i])
        continue;
    
        else
        break;
    }
    if (i==arr.Length)
    Console.WriteLine("All element in array are equal");
    

    【讨论】:

      【解决方案3】:

      如果没有必要编写如此命令式的代码,除了实现你的最终目标——你不必这样做。几乎总是你可以用一种更易读的方式来做。

      我建议使用 LINQ。对于实现IEnumerable&lt;T&gt;的集合:

      newArr.Distinct().Take(2).Count() == 1
      

      LINQ 是一项内置功能,只需确保您的 using System.Linq; 位于 .cs 文件的顶部即可。

      这里发生了什么?

      • Distinct 返回一个 IEnumerable&lt;T&gt;,它的枚举将给出数组中所有不同的元素,但还没有枚举,因此还没有发生计算。
      • Take 返回新的IEnumerable&lt;T&gt;,它的枚举将在内部枚举以前的IEnumerable&lt;T&gt;,但它只会给出前两个不同的元素。同样,还没有发生枚举。
      • 最后,Count 枚举最后一个 IEnumerable&lt;T&gt; 并返回其元素计数(在我们的例子中为 012)。
      • 当我们使用Take(2) 时,Count 方法启动的枚举将在找到第二个不同元素时立即停止。如果我们不使用Take(2),即使不需要,我们的代码也会枚举整个数组。

      为什么这种方法更好?

      • 短得多可读性更强
      • 惰性求值 – 如果发现一个元素与其他元素不同,则立即停止枚举;
      • 灵活 - 您可以将自定义相等比较器传递给 Distinct 方法。您也可以在调用Distinct 之前调用Select 方法来选择将比较您的元素的特定成员;
      • 通用 - 适用于任何实现IEnumerable&lt;T&gt; 接口的集合。

      其他方式

      同样的结果可以通过稍微其他的方式来实现,例如:

      !newArr.Distinct().Take(2).Skip(1).Any()
      

      使用 LINQ 进行实验并选择您和您的团队认为最易读的方式。

      对于实现IList&lt;T&gt; 的集合,您还可以编写(如@Alexander 建议的那样):

      newArr.All(x => x == newArr[0])
      

      这个变体更短,但没有那么灵活和通用。


      OFF TOPIC.封装通用代码

      您应该将做一件简单事情的代码封装到一个单独的方法中,它进一步提高了代码的可读性并允许在多个地方重用您的方法。我会为此编写一个扩展方法。

      public static class CollectionExtensions {
          public static bool AllElementsEqual<T>(this IEnumerable<T> items) {
              return items.Distinct().Take(2).Count() == 1;
          }
      }
      

      稍后在您的代码中,您只需调用此方法:

      newArr.AllElementsEqual()
      

      【讨论】:

        【解决方案4】:

        试试这个..

        for (int i = 0; i < newArr.Length-1; i++)
        {
         for(int j=0 ;j< newArr.Length-1; i++)
              {
              if (newArr[i] == newArr[j])
               {
                    /////
                }
               }
        
            }
            else
            {
                Console.Write(" ");
            }
        }
        

        【讨论】:

        • 1.您永远不会将最后一个元素与其他元素进行比较; 2. O(n) 运算转换为 O(n^2) 的意义何在?
        猜你喜欢
        • 2015-02-12
        • 2018-05-13
        • 2019-07-04
        • 2019-05-25
        • 2012-12-16
        • 2013-01-27
        • 1970-01-01
        • 2013-12-15
        相关资源
        最近更新 更多