2016-11-18 14 views
0

我正在處理一個項目,並且我發現很難刪除與該項目標識相關的整個行,無需用戶想要刪除。我知道你不能只是從數組中刪除。我想轉移,比如說如果我找到用戶提供的項目ID,我將與該ID相關聯的整行(每個id有幾列)移動到最後一行,然後我的數據中的整個列向上移動一行。我的意思是說這很容易,但我發現很難寫入代碼。刪除從數組提供的項目用戶

+0

因此,您不希望從您的數據庫中刪除實體?我不明白爲什麼,但無論如何,您還可以在實體上設置一個標誌,標誌它處於活動狀態或非活動狀態,然後僅顯示標誌設置爲活動狀態的標誌。 – HimBromBeere

+0

是否要刪除或不刪除?爲什麼你的變量叫做「itemidnotodelete」?你想達到什麼目的?根據ID取一個項目,將它移動到數組的末尾,並移動數組中的所有內容以關閉「孔」。 ? – agfc

+0

@AlexeiFimine我想要刪除。變量「itemidnotodelete」是用戶輸入的內容。如果找到ID號碼,我試圖刪除整行。例如,在第1行即標題中有一列(itemID,Type,Placesfound,Uses),在第2行的下面有(123,盤子,陶瓷,廚房,吃東西),第3行有(456 ,耳機,電子產品,娛樂)以及第4行,第5行等等。所以我們可以說我想刪除itemID 456?如何將itemID 456的整行移動到數組中的最後一個位置,然後縮小它。這是我的問題。 – user124473

回答

0

這是我認爲你需要完成的代碼。它會從陣列中移出並刪除您的記錄,將所有內容都移到一個位置,並將您的記錄放到數組的末尾。我使用了一些你的代碼。如果堅持所有這一切到你的主要應用程序的應用程序它將工作。這是O(n)時間/ 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

我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是不是最快的方式據我所知 –

+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應該剛剛覆蓋你要刪除的數據並將所有其他數據向上移一行

+0

我會這樣做,但「item」被初始化爲包含標題s的結構,即itemIDNo,itemID,Type,Placesfound,Uses,我正在使用它來解決此問題。所以我只需要一個不同的方法。 – user124473

1

你是對的,你不能從數組中刪除(或者爲此添加它)。

如果您需要添加/刪除項目,正確的解決方案是使用另一個容器。

用於在.NET中添加和刪除的最常見容器是List<T>

+0

我沒有被教過名單,我敢打賭這會更容易。我只是在處理我所教的內容。請參閱我對@AlexeiFimine的評論 – user124473

+0

在代碼中,item被聲明爲一個struct數組。我會欣賞提示。 – 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++; 
     }