[C#] C #의 배열에서 요소를 삭제하는 방법

이 배열이 있다고 가정 해 봅시다.

int[] numbers = {1, 3, 4, 9, 2};

“이름”으로 요소를 어떻게 삭제합니까? 4 번이라고 해?

심지어 ArrayList삭제하는 데 도움이되지 않았다?

string strNumbers = " 1, 3, 4, 9, 2";
ArrayList numbers = new ArrayList(strNumbers.Split(new char[] { ',' }));
numbers.RemoveAt(numbers.IndexOf(4));
foreach (var n in numbers)
{
    Response.Write(n);
}



답변

색인을 몰라도 4의 모든 인스턴스를 제거하려면 다음을 수행하십시오.

LINQ : (.NET Framework 3.5)

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

비 LINQ : (.NET Framework 2.0)

static bool isNotFour(int n)
{
    return n != 4;
}

int[] numbers = { 1, 3, 4, 9, 2 };
numbers = Array.FindAll(numbers, isNotFour).ToArray();

첫 번째 인스턴스 만 제거하려면 다음을 수행하십시오.

LINQ : (.NET Framework 3.5)

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

비 LINQ : (.NET Framework 2.0)

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIdx = Array.IndexOf(numbers, numToRemove);
List<int> tmp = new List<int>(numbers);
tmp.RemoveAt(numIdx);
numbers = tmp.ToArray();

편집 : Malfist가 지적한 것처럼 아직 파악하지 못한 경우 LINQ 코드 예제가 작동하려면 .NET Framework 3.5를 대상으로 지정해야합니다. 2.0을 대상으로하는 경우 비 LINQ 예제를 참조해야합니다.


답변

int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();


답변

배열을 목록으로 변환하고 목록에서 remove를 호출 할 수도 있습니다. 그런 다음 배열로 다시 변환 할 수 있습니다.

int[] numbers = {1, 3, 4, 9, 2};
var numbersList = numbers.ToList();
numbersList.Remove(4);


답변

질문에 작성된 코드에는 버그가 있습니다.

arraylist에 “1” “3” “4” “9”및 “2”문자열이 포함됩니다 (공백 참조).

따라서 IndexOf (4)는 4가 int이기 때문에 아무것도 찾지 못하며 “tostring”조차도 “4”가 아닌 “4”로 변환하고 아무것도 제거되지 않습니다.

arraylist는 원하는 것을 수행하는 올바른 방법입니다.


답변

요소의 모든 인스턴스를 제거하려면 Balabaster의 대답이 정확합니다. 첫 번째 것만 제거하려면 다음과 같이하십시오.

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int firstFoundIndex = Array.IndexOf(numbers, numToRemove);
if (numbers >= 0)
{
    numbers = numbers.Take(firstFoundIndex).Concat(numbers.Skip(firstFoundIndex + 1)).ToArray();
}


답변

내 솔루션을 여기에 게시했습니다 .

이것은 같은 배열 인스턴스의 프레임에서 다른 배열로 복사하지 않고 배열 요소를 삭제하는 방법입니다.

    public static void RemoveAt<T>(ref T[] arr, int index)
    {
        for (int a = index; a < arr.Length - 1; a++)
        {
            // moving elements downwards, to fill the gap at [index]
            arr[a] = arr[a + 1];
        }
        // finally, let's decrement Array's size by one
        Array.Resize(ref arr, arr.Length - 1);
    }


답변

크기 조정을 처리해야하므로 배열 자체에서 제거하는 것은 간단하지 않습니다. 이것은 List<int>대신에 비슷한 것을 사용하는 큰 장점 중 하나입니다 . 그것은 제공 Remove/ RemoveAt2.0 및 3.0 LINQ 확장의 많은.

가능하면 리팩터링하여 List<>또는 유사한 것을 사용하십시오 .