NULL в строковом массиве - PullRequest
       34

NULL в строковом массиве

3 голосов
/ 16 февраля 2010

Как удалить нулевые значения в строковом массиве

Как {, -2,3,, -4, + 5,, 66 ...}

Мне нужно удалить эти нулевые значения между ними и изменить размер массива

  1. Я не хочу использовать списки

  2. Я не хочу создавать новый массив

Пожалуйста, дайте мне знать, если это возможно с простым кодом. Спасибо.

Ответы [ 7 ]

16 голосов
/ 16 февраля 2010

Нет, это невозможно без создания нового массива. Вы не можете изменить размер массива.

Вы можете легко создать новый массив без пустых строк и нулевых ссылок, например:

string[] items = new string[] { "", "-2", "3", null, "-4", "+5", null, "66" };

items = items.Where(s => !String.IsNullOrEmpty(s)).ToArray();
9 голосов
/ 16 февраля 2010

Если вы не хотите создавать новый массив, то нет, это невозможно. Вы не можете добавить или удалить элемент из простого массива (например, string[]).

Самый простой способ выполнить то, что вы хотите достичь (если вы удалите второе требование), будет:

  1. Подсчет количества нулевых значений в исходном массиве
  2. Создайте новый массив той же длины, что и ваш исходный массив, минус количество нулей из шага 1
  3. Скопируйте все ненулевые значения из исходного массива в новый массив
  4. (Необязательно) Установите ссылку на ваш исходный массив (например, srcArray) на ваш новый массив
2 голосов
/ 16 февраля 2010

Как сказал Дэн, вы не можете добавлять или удалять значения из Array. Однако вы можете использовать LINQ для удаления значений и создания второго массива.

originalArray = originalArray.Where(s => !string.IsNullOrEmpty(s)).ToArray()
1 голос
/ 16 февраля 2010

Возможно, не самое эффективное решение, но ...

array.Where(s => s != null).ToArray();

Это создаст новый массив, но я не могу придумать решение, которое не будет.

0 голосов
/ 07 ноября 2017
string[] _array= new string[] { "", "z", "d", null, "a", "b", null, "66" };

// select non-null elements only
_array= _array.Where(a => !String.IsNullOrEmpty(a)).ToArray();
0 голосов
/ 16 февраля 2010

Я единственный, кто просканирует массив и переместит элементы обратно через NULL, создавая непрерывный список ненулевых значений.

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

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

0 голосов
/ 16 февраля 2010

Прежде чем решить, как поступить, вам действительно нужно подумать о , который содержит ссылку на массив, с которым вы работаете.

Если массив не , на который ссылается какой-либо другой код (как член класса, как захваченная переменная в лямбда-выражении или в некоторой коллекции где-либо) тогда вам не стоит беспокоиться о создании нового массива . В этом случае я бы использовал что-то вроде того, что @ Codesleuth или @ Guffa предлагает.

Однако, если может существовать другой код, который содержит ссылку на этот же массив - тогда вам не повезло, если вы не можете безопасно идентифицировать и обновить ссылки, хранящиеся в этих других местах. Это трудная вещь, которую нужно сделать - и вы должны быть очень осторожны, предполагая, что вы всегда можете обновить все другие места, где хранится ссылка.

...