在第一部分中,我使用数组元素创建对,并且数组的长度是两倍。数组总是均匀。
这是第一部分:
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]
的代码答案 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>
并返回其元素计数(在我们的情况下为0
,1
或2
)。Take(2)
时,由Count
方法发起的枚举将在找到第二个不同元素时立即停止。如果我们不使用Take(2)
,那么即使不需要,我们的代码也会枚举整个数组。为什么这种方法更好?
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(" ");
}
}