2011-12-28 6 views
4

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

string[] fruits = { "Banana", "Apple", "Watermelon", "Pear", "Mango" }; 

Например, предположим, что я хочу удалить «Яблоко», поэтому я сделаю это.

fruits[1] = ""; 

Теперь все, что слева находятся:

{ "Banana", "", "Watermelon", "Pear", "Mango" } 

Как я действительно удалить часть компании Apple и получить только:

{ "Banana", "Watermelon", "Pear", "Mango" } 

Обратите внимание, что индекс всех элементов из «Арбуз» до конца массива перемещается 1 назад. Есть идеи?

+3

@Morten: никогда не предлагайте использовать универсальные контейнеры, такие как ArrayList. Вместо этого используйте общий список «»! – abatishchev

+0

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

+0

@MortenAnderson действительно нет необходимости в использовании ArrayList (если вы не используете .NET 1). – Ray

ответ

6

Если вы действительно хотите использовать массивы, вы можете использовать Linq для фильтрации списка и преобразовать в массив:

string[] fruits = { "Banana", "Apple", "Watermelon", "Pear", "Mango" }; 

    fruits = fruits.Where(f => f != "Apple").ToArray(); 

Если вы не обязаны использовать массив, посмотрите на List class. Список позволяет добавлять и удалять элементы.

+0

Awesome 'Wouter de Kort' – Dotnet

+0

это удалит все« Яблоко » – Moonlight

+0

. Я попробую это, так как я буду содержать только один элемент. –

9

Класс List является правильным для вас. Он предоставляет метод Remove, который автоматически перемещает следующие элементы назад.

+0

Хорошо, моя команда позволила мне изменить массив в списки, я буду использовать это. –

2

Подобный ответ Wouter, в, если вы хотите удалить по индексу элемента, а не значение элемента, вы можете сделать:

fruits = fruits.Where((s, i) => i != 1).ToArray(); 
1

Вы можете сделать что-то вроде этого:

for(int i = 1; i + 1 < fruits.Length; i++) 
    fruits[i] = fruits[i + 1]; 
fruits = System.Array.Resize(fruits, fruits.Length - 1); 

Если вы не заботятся о порядке плодов в массиве, более разумный способ сделать это следующим образом:

fruits[1] = fruits[fruits.Length - 1]; 
fruits = System.Array.Resize(fruits, fruits.Length - 1); 
+0

Я знаю, что .... на самом деле моя программа - любимый сборщик фруктов. Я знаю, что фрукты бесчисленны, поэтому у него есть другой массив. фрукты на самом деле означает Fruit Special в моем приложении. –

+0

C -: = Знаете, когда я учил английский, 30 лет назад, я узнал, что он бесчисленный. Но я посмотрел его сейчас, чтобы убедиться, что я не говорю о некорректных вещах, а в словарей.com говорится, что множественное число - это плоды. Поэтому я не знаю, является ли это американской идиомой (тогда я узнал английский английский) или изменился ли язык с тех пор. Итак, я удалил эту часть из своего ответа. –

+0

@Naufal: Вам определенно нужно использовать 'List '! – abatishchev

1

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

Хотя я думаю, что опция «Список», о которой другие упоминали, вероятно, вы ищете, стоит посмотреть на класс LinkedList, если вы делаете много вложений и удалений и не слишком много смотрите вверх по индексу.

0

Это пример того, как я использовал списки и массивы для удаления элемента из массива. Примечание. Я также покажу вам, как использовать linq для поиска массива с плохими именами для удаления. Надеюсь, это поможет кому-то.

public static void CheckBadNames(ref string[] parts) 
    { 
     string[] BadName = new string[] {"LIFE", "ESTATE" ,"(",")","-","*","AN","LIFETIME","INTREST","MARRIED", 
             "UNMARRIED","MARRIED/UNMARRIED","SINGLE","W/","/W","THE","ET", 
             "ALS","AS", "TENANT" }; 

     List<string> list = new List<string>(BadName); //convert array to list 

     foreach(string part in list) 
     { 
      if (BadName.Any(s => part.ToUpper().Contains(s))) 
      { 
       list.Remove(part); 
      } 
     } 

     parts = list.ToArray(); // convert list back to array 
    } 
Смежные вопросы