7

我需要在 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);
4

6 回答 6

8

好吧,首先你必须决定什么是无效值。是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);
于 2012-06-05T23:44:12.663 回答
3

虽然 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
于 2012-06-05T23:58:44.053 回答
1
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。如果您正在寻找数组中非零元素的数量,您应该按照建议进行操作在其他一些答案中。

于 2012-06-05T23:45:02.433 回答
0

当您在不指定任何值的情况下初始化整数数组时,C# 将零值分配给每个元素。因此,如果零不是您的数组的有效值,您可以随时进行测试。

或者,您可以将数组的元素初始化为在您的上下文中无效的某个值(即,如果负数无效,则初始化为-1),然后循环遍历数组,计算有效元素。

于 2012-06-05T23:52:20.467 回答
0

如果保证数组只能按顺序访问,您可以通过一点分而治之来击败完整的迭代 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);
于 2012-06-06T02:05:18.320 回答
0

如果除您之外的其他人初始化了数组(即,您没有将数组值初始化为无效值的选项——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

于 2018-08-08T16:35:52.723 回答