2014-12-15 4 views
2

У меня есть динамический массив строк, и я заполнил его некоторыми динамическими значениями с помощью ReDim и т. Д. Я хотел бы удалить элемент из массива строк в определенной позиции. Я прочитал об использовании условия Where, использующего System.Linq, но не могу получить правильный ответ на этот вопрос. Какие-либо предложения?Удалить элемент из определенного индекса из динамического массива String

Dim dynamic() as String 
... 
Redim dynamic(2) 
.. 
dynamic(0) = Apple 
dynamic(1) = Banana 
dynamic(2) = Orange 
.. 

dynamic(i).Remove... etc? 
+0

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

+3

Используйте Instast List (String) для массива, и вы можете использовать LINQ – Plutonix

ответ

3

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

Если вы собираетесь делать много такого, я бы рекомендовал использовать класс List(Of String), а не массив String. Как отмечали другие, класс List(Of T) специально разработан, чтобы сделать эти виды динамических функций более простыми. Если вам когда-нибудь понадобится список как массив, вы можете очень легко (и эффективно) преобразовать его в массив как это:

Dim myList As New List(Of String)() 
myList.Add("Apple") 
myList.Add("Banana") 
myList.Add("Orange") 
myList.RemoveAt(1) 
Dim myArray() As String = myList.ToArray() 

Однако, если вы действительно должны иметь его как массив, LINQ делает его немного легче. Импортируя пространство имен LINQ, многие новые методы расширения LINQ будут добавлены в массивы (и любой другой список или перечислимые объекты). Например, вы могли бы использовать Except метод LINQ, как и это:

Dim dynamic() As String = {"Apple", "Banana", "Orange"} 
dynamic = dynamic.Except({"Banana"}).ToArray() 

Обратите внимание, что метод возвращает Except перечислимого объекта, но не массив. Чтобы преобразовать его в массив, вам необходимо дополнительно вызвать метод LINQ ToArray, как в приведенном выше примере. Этот выше пример удаляет строку "Banana" из середины массива. Если, однако, вы не знаете значения, и вы просто хотите удалить его по индексу, LINQ не предоставляет способ фильтрации по индексу, подобному этому. Вы можете по-прежнему использовать метод Except, как это, хотя:

Dim dynamic() As String = {"Apple", "Banana", "Orange"} 
dynamic = dynamic.Except({dynamic(1)}).ToArray() 

Вы можете быть удивлены, почему я поставил фигурные скобки вокруг параметра, переданного методу Except. Я сделал это, потому что метод Except фактически принимает список параметров (например, IEnumerable). Поскольку реализация массива IEnumerable (а также IList, кстати), я только что завернул параметр в массив, прежде чем передать его методу. Интересным результатом этого является то, что если у вас есть несколько элементов для удаления, вы можете сделать их все в одной команде, например:

Dim dynamic() As String = {"Apple", "Banana", "Orange"} 
dynamic = dynamic.Except({"Apple", "Banana"}).ToArray() 
+0

Это на самом деле очень полезно. Постараемся попробовать. Спасибо за ответ. – Neophile

1

Вы не можете делать это напрямую с помощью массивов. Но вы можете это сделать:

Dim tmp = New List(Of string)(dynamic) 
tmp.RemoveAt(index) 
dynamic = tmp.ToArray() 
+0

. Я попробую ... Вернусь к вам. – Neophile

Смежные вопросы