检查数组中的所有元素是否相等

时间:2014-04-17 08:43:43

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

在第一部分中,我使用数组元素创建对,并且数组的长度是两倍。数组总是均匀。

这是第一部分:

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]

的代码

4 个答案:

答案 0 :(得分:1)

您需要更改的是for循环中的终止条件

i < newArr.Length - 1

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

答案 1 :(得分:1)

试试这个

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");

答案 2 :(得分:0)

如果除了实现最终目标之外,无需编写如此必要的代码,则不必这样做。几乎总是可以用一种更具可读性的方式来做到这一点。

我建议使用LINQ。对于实现IEnumerable<T>的集合:

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

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

这是怎么回事?

  • Distinct返回一个IEnumerable<T>,其枚举将给出数组中所有不同的元素,但没有枚举,因此尚未进行计算。
  • Take返回新的IEnumerable<T>,其枚举将在内部枚举先前的IEnumerable<T>,但仅给出前两个不同的元素。再次,没有枚举发生。
  • 最后,Count枚举最后一个IEnumerable<T>并返回其元素计数(在我们的情况下为012)。
  • 当我们使用Take(2)时,由Count方法发起的枚举将在找到第二个不同元素时立即停止。如果我们不使用Take(2),那么即使不需要,我们的代码也会枚举整个数组。

为什么这种方法更好?

  • 更短更易读;
  • 惰性计算 –如果发现某个元素与其他元素不同,则枚举将立即停止;
  • Flexible –您可以将自定义的相等比较器传递给Distinct方法。您还可以在调用Select之前先调用Distinct方法,以选择要与之比较的特定成员;
  • 通用 –与实现IEnumerable<T>接口的任何集合一起使用。

其他方式

相同的结果可以通过其他方式实现,例如:

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

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

对于实现IList<T>的集合,您还可以编写(如@Alexander建议):

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

此变体较短,但不够灵活和通用。


关闭主题。封装通用代码

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

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

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

newArr.AllElementsEqual()

答案 3 :(得分:-2)

试试这个..

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(" ");
    }
}