Как мы можем найти количество элементов в целочисленном массиве C#?

мне нужно найти количество элементов в массиве 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);

6 ответов


Ну, сначала вы должны решить, какое недопустимое значение будет. Это 0? Если это так, вы можете сделать это:

int result = intArray.Count(i => i != 0);

обратите внимание, что это работает только потому, что по умолчанию элементы массива инициализируются к нулю. Вам придется заполнить массив другим недопустимым значением заранее, Если 0 окажется допустимым в вашей ситуации.

другой способ-использовать тип nullable:

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?

Edit:

кхм. Как мне было скромно указано,--1--> возвращает общее количество элементов в массиве, который в вашем примере было бы 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 записей были инициализированы. Примером может служить массив необработанных байтов, считанных из аудиофайла в буфер, и вы хотите узнать индекс последнего элемента, который был прочитан.

альтернативой, которая не идеальна, но может сделать то, что вы ищете, является поиск последней ненулевой записи, как описано здесь: Linq-получить индекс последнего ненулевого числа массива