2016-11-18 1 views
0

프로젝트에서 작업하고 있는데 사용자가 삭제하지 않으려는 항목 ID와 관련된 전체 행을 삭제하는 것이 어렵습니다.배열에서 제공된 항목 사용자 삭제

//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) 

나는 배열에서 삭제할 수 없다는 것을 알고 있습니다. 나는 사용자가 제공하는 아이템 ID를 찾으면 그 ID와 연관된 행 전체를 마지막으로 옮긴 다음 데이터의 전체 열이 위로 이동한다고 전제하고 싶다. 말로 표현하기가 쉽지만 코드를 작성하기가 어렵습니다. 내가 아는

+0

데이터베이스에서 엔티티를 삭제 하시겠습니까? 그 이유는 알 수 없지만, 어쨌든 엔티티에 플래그를 설정하여 활성화 또는 비 활성화로 표시 한 다음 플래그를 활성화로 설정 한 사용자 만 표시 할 수 있습니다. – HimBromBeere

+0

삭제 하시겠습니까? 삭제하지 않으시겠습니까? 변수가 "itemidnotodelete"라고하는 이유는 무엇입니까? 무엇을 성취하려고합니까? ID에 따라 항목을 가져 와서 배열 끝으로 옮기고 배열의 모든 항목을 "구멍"을 닫습니다. ? – agfc

+0

@AlexeiFimine 삭제하고 싶습니다. 변수 "itemidnotodelete"는 사용자가 입력하는 것입니다. ID 번호가 발견되면 전체 행을 삭제하려고합니다. 예를 들어, 1 행에 (itemID, Type, Placesfound, Uses)의 열이 있고 2 행에 (123, plates, ceramic, kitchen, eating), 3 행에 456 , 헤드폰, 전자 제품, 엔터테인먼트) 및 행 4, 행 5 등. 그래서 아이템 ID 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

나는 이것이 내가 찾고있는 것입니다. 나는 질문을 가지고 있는데, 왜 당신은 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

코드를 작성하는 짧은 방법을 의미합니다. 지금까지 내가 아는 한 가장 빠르지 않은 방법 –

+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

나는 List를 배웠지 않았고, 더 쉬울 것이라고 확신한다. 나는 내가 배운 것만으로하고 있습니다. @AlexeiFimine에 대한 내 의견을 참조하십시오 – user124473

+0

코드에서 항목은 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++; 
     }