2016-11-18 2 views
0

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

//a bunch of codes that includes switch and struct statement and a while statement before this snip of code I just pasted       

Console.Write("Please enter an item ID No: "); 
string id = Console.ReadLine(); 
int itemidnotodelete = int.Parse(id); 
bool iDelete = false; 

for (int i = 0; i < ItemCount; i++) 
{ 
    if (item[i].itemIDNo == itemidnotodelete) 
    { 
     iDelete = true; 
     //Delete the item if you found it 
     item[i + 1].itemIDNo = item[i + 1]; 

     //Reset the count to show a new count for your list 
     ItemCount = ItemCount - 1; 
     //(Note: your list is now reduced by one item) 

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

+0

Таким образом, вы не хотите удалить объекты из вашей БД? Я не могу понять, почему, но в любом случае вы можете также установить флаг на сущности, обозначающей ее активную или неактивную, а затем показать только тех, у кого установлен флаг. – HimBromBeere

+0

Вы хотите удалить или удалить? Почему ваша переменная называется «itemidnotodelete»? Чего вы пытаетесь достичь? Возьмите элемент в соответствии с идентификатором, переместите его в конец массива и сдвиньте все в массиве, чтобы закрыть «отверстие». ? – agfc

+0

@AlexeiFimine Хочу удалить. Переменная «itemidnotodelete» - это то, что пользователь вводит. Я пытаюсь добиться удаления целой строки, если идентификационный номер найден. Например, у вас есть столбец (itemID, Type, Placesfound, Uses) в строке 1, т. Е. Заголовок, а под тем, что в строке 2 есть (123, плиты, керамика, кухня, еда), в строке 3 у вас есть (456 , наушники, электроника, развлечения) и ряд 4, ряд 5 и т. д. Так что скажем, я хочу удалить itemID 456? Как перенести всю строку itemID 456 в последнюю позицию в моем массиве, а затем сжать ее. Это моя проблема. – user124473

ответ

0

Вот код, который делает то, что я думаю, вам нужно сделать. Он идет и удаляет вашу запись из массива, сдвигает все одну позицию и помещает вашу запись в конец массива. Я использовал часть вашего кода. Если все это вложить в «основное» консольное приложение, оно будет работать. Это O (п)/O (N + 1) пространство - в случае, если вам нужно, чтобы оправдать свой выбор алгоритма :)

struct MyWreck 
     { 
      public int Id; 
      public string Desc; 
     } 
     static int itemCount = 10; 
     static MyWreck[] items = new MyWreck[10]; 

     public static void PrepareArray() 
     { 
      var seed = 400; 
      for (var i = 0; i < itemCount; i++) 
      { 
       items[i] = new MyWreck { Id = seed + i, Desc = "Description " + i }; 
      } 

     } 

     public static void DeleteFromArray() 
     { 

      PrepareArray(); 

      Console.Write("Please enter an item ID No: "); 
      string id = Console.ReadLine(); 
      int itemidnotodelete = int.Parse(id); 
      bool iDelete = false; 

      var removedWreck = new MyWreck(); 

      for (int i = 0; i < itemCount; i++) 
      { 
       if (items[i].Id == itemidnotodelete) 
       { 
        iDelete = true; 
        removedWreck = items[i]; 

       } 
       if (iDelete) 
       { 
        if (i < itemCount - 1) 
        { 
         items[i] = items[i + 1]; 
        } 
        else 
        { 
         items[i] = removedWreck; 
        } 
       } 
      } 
     } 
    } 
+0

I thik это то, что я ищу. У меня есть вопрос, почему вы объявили var removeWreck? – user124473

+0

Потому что вам нужно сохранить удаленную запись где-нибудь, пока вы перемещаете остальную часть массива. Когда все записи сдвинуты, вы берете свою «удаленную» запись и помещаете ее в конец массива. Другим решением было бы сделать ваш массив длиннее на 1 и сохранить там удаленную запись, но я нахожу его более беспорядочным с точки зрения работы с индексом. – agfc

+0

Если вам не нужно хранить эту удаленную запись в конце, просто удалите все, что связано с переменной «removedWreck». – agfc

0

самый быстрый способ я знаю, что бы LINQ например .:

int[] numbers = { 1, 3, 4, 9, 2 }; 
int numToRemove = 4; 
numbers = numbers.Where(val => val != numToRemove).ToArray(); 

Если у вас есть другие массивы комплексного типа вы просто должны изменить .где заявление.

+3

Вы имеете в виду короткий путь к кодированию, linq is не самый быстрый способ, насколько я знаю –

+0

http://stackoverflow.com/questions/496896/how-to-delete-an-element-from-an-array-in-c-sharp здесь вы можете найти несколько способов сделать это. – TripleEEE

+0

@asdf_enel_hak - ну, вероятно, вы правы - сильно зависит от количества предметов. Я должен был быть более правильным и сказать: «Самый быстрый способ его реализации» - извините за неточное заявление – TripleEEE

0
item[i + 1].itemIDNo = item[i + 1]; 

я бы изменить его item[i].itemIDNo = item[i + 1]; и упаковать его в петлю, которая перебирает через массив, пока вы не на размер-1. то вы можете сломаться. теперь oyu должен был просто перезаписать данные, которые вы хотите удалить, и сдвинуть все остальные данные. 1 строка вверх

+0

Я бы сделал это, но «item» инициализируется структурой, содержащей заголовок, т.е. itemIDNo, itemID, Type, Placesfound, Uses, которые я использую для решения этой проблемы. Поэтому мне просто нужен другой подход. – user124473

1

Вы правы, вы не можете удалить из массива (или добавить его на этот счет).

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

Наиболее распространенный контейнер для добавления и удаления в .NET - это List<T>.

+0

Мне не преподавали список, и я уверен, это будет проще. Я просто занимаюсь тем, чему меня учат. См. Мой комментарий к @AlexeiFimine – user124473

+0

В коде элемент объявляется как массив структуры. Буду признателен за намеки. – user124473

0

Linq подход

item = item.Where(x => x.itemIDNo == int.Parse(Console.ReadLine())).ToArray(); 
ItemCount = item.Length; //or better replace ItemCount with item.Length 
0

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

 int[] items = { 1, 3, 4, 9, 2 }; 
     int[] newItems = new int[items.Length-1]; 
     var itemtodelete = 4; 
     int itemIndex=-1; 
     int j = 0, k = 0; 

     for (int i = 0; i < items.Length; i++) 
     { 
      if (items[i] == itemtodelete) 
      { 
       itemIndex = i; 
       break; 
      } 
     } 

     while (j < items.Length - 1) 
     { 
      if (k != itemIndex) 
      { 
       newItems[j++] = items[k]; 
      } 
      k++; 
     } 
Смежные вопросы