我需要在 C# 数组中找到整数类型的项目计数。
我的意思是;
int[] intArray=new int[10]
int[0]=34
int[1]=65
int[2]=98
intArray 的项目数为 3。
我在下面找到了 strArray 的代码,但它不适用于 int 数组。
string[] strArray = new string[50];
...
int result = strArray.Count(s => s != null);
好吧,首先你必须决定什么是无效值。是0吗?如果是这样,你可以这样做:
int result = intArray.Count(i => i != 0);
请注意,这仅有效,因为默认情况下,int 数组的元素被初始化为零。如果 0 在您的情况下最终有效,您必须事先用不同的无效值填充数组。
另一种方法是使用可为空的类型:
int?[] intArray = new int?[10];
intArray[0] = 34;
intArray[1] = 65;
intArray[2] = 98;
int result = intArray.Count(i => i.HasValue);
虽然 itsme86 为您的实际问题提供了一个很好的答案,但我怀疑您最好重新考虑如何完全编写它。
如果这是您的目标,我建议您以不同的方式考虑这一点。而不是分配一个固定大小的数组,并且只为其分配特定的值,您可能需要考虑使用List<int>
:
List<int> intList = new List<int>();
intList.Add(34);
intList.Add(65);
intList.Add(98);
项目的数量将始终为intList.Count
,您可以通过这种方式添加任意数量的项目,而不必担心“分配的大小”,因为列表会根据需要自动增长。如果您将其作为实际值0
添加到列表中,它也不会给您带来不好的结果,如果它是一个有效值,计算非零元素将不计为零。
请注意,您也可以按索引访问项目,就像使用数组一样:
int secondValue = intList[1]; // Access like you do with arrays
int[] intArray=new int[3] // Edit: Changed this to 3 to make my answer work. :)
int[0]=34
int[1]=65
int[2]=98
int count = intArray.Length; // <-- Is this what you're after?
咳咳。正如我谦虚地指出的那样,Length
将返回数组中的元素总数,在您的示例中为 10。如果您正在寻找数组中非零元素的数量,您应该按照建议进行操作在其他一些答案中。
当您在不指定任何值的情况下初始化整数数组时,C# 将零值分配给每个元素。因此,如果零不是您的数组的有效值,您可以随时进行测试。
或者,您可以将数组的元素初始化为在您的上下文中无效的某个值(即,如果负数无效,则初始化为-1),然后循环遍历数组,计算有效元素。
如果保证数组只能按顺序访问,您可以通过一点分而治之来击败完整的迭代 IEnumerable Count(对于更大的数组),例如
static int DivideCount(int[] arr, int idx, int bottom, int top)
{
if (idx <= 0)
return 0;
else if (idx >= arr.Length - 1)
return arr.Length;
else if (arr[idx] == 0 && arr[idx - 1] != 0)
return idx;
else if (arr[idx] == 0 && arr[idx - 1] == 0)
return DivideCount(arr, bottom + ((idx - bottom) / 2), bottom, idx);
else if (arr[idx] != 0 && arr[idx - 1] != 0)
return DivideCount(arr, top - ((top - idx) / 2), idx, top);
else
return -1; // hello compiler
}
int[] intArray = new int[10];
intArray[0] = 35;
intArray[1] = 65;
intArray[2] = 98;
var count = DivideCount(intArray, intArray.Length / 2, 0, intArray.Length);
如果除您之外的其他人初始化了数组(即,您没有将数组值初始化为无效值的选项——null、-1 等),则之前的解决方案都不是最佳的。
假设你有一个数组:
var arr = new[] {0, 10, 18, 0, 20, 0, 0, 0, 0, 0, 0, 0};
如果您只是计算零条目的数量:
int result = arr.Count(i => i != 0);
Count()
返回 3,实际上已经初始化了 5 个条目。一个例子是从音频文件中读取到缓冲区的原始字节数组,您想知道最后读取的元素的索引。
An alternative that isn't perfect but could do what you're looking for is to look for the last non-zero entry, as described here: Linq - Get the Index of the Last Non-Zero Number of Array