Удалить элементы массива с помощью Array.FindAll - PullRequest
0 голосов
/ 24 октября 2010

Как я могу удалить элемент в массиве?

Это то, что у меня есть, что не в порядке.

// fr_watchdog.items = public array
string numToRemove = "test";
fr_watchdog.items = Array.FindAll(fr_watchdog.items,
                                  val => val != numToRemove).ToArray();

Все готово. Я нашел решение этой проблемы (перечислены ниже). Можно ли удалить вопрос?

ArrayList items = new ArrayList();

int index = Array.IndexOf(items, "Delete me");

if ( index != -1 )
{
    string[] copyStrArr = new string[items.Length - 1];
    for ( int i = 0; i < index; i++ )
    {
         copyStrArr[ i ] = items[ i ];
    }
    for ( int i = index ; i < copyStrArr.Length; i++ )
    {
         copyStrArr[ i ] = items[i + 1];
    }
}

Ответы [ 2 ]

3 голосов
/ 24 октября 2010

Вы не можете «удалить» элемент из массива на самом деле - вы можете установить значение элемента в null (при условии, что это ссылочный тип), но массивы имеют фиксированный размер, поэтому вы не можете «удалить» элемент любойбольше, чем вы можете «добавить» один.

То, что вы показали в своем вопросе, создаст новый массив - хотя он на самом деле создает два массива, потому что вы вызываете ToArrayна результат, без особой причины.

Даже не ясно, какой метод ToArray вы вызываете, учитывая, что вы упомянули .NET 2, который не включает LINQ to Objects.Вы используете LINQBridge?Более идиоматический способ LINQ был бы таким:

fr_watchdog.items = fr_watchdog.items.Where(val => val != numToRemove)
                                     .ToArray();

Однако вы сказали, что это "не хорошо", не говоря о том, что способ это не хорошо.Он создаст новый массив, заполненный элементами, значение которых не равно numToRemove.Чем это не то, что вам нужно?

Если проблема в том, что метод ToArray не работает точно , потому что вы используете .NET 2 без LINQBridge, тогдапросто удалите звонок на ToArray() из вашего исходного кода FindAll.Опять же, обратите внимание, что это не изменит содержимое существующего массива - поэтому любые другие ссылки на этот исходный массив все равно будут видеть все исходные элементы.

0 голосов
/ 24 октября 2010

fr_watchdog.items может быть только для чтения свойство (свойство без установщика) или только для чтения поле (поле, объявленное с ключевым словом readonly).Если это так, вы не можете назначить его.

...