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


153

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

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);
}

목록에 중복 값이 ​​있으면 어떻게합니까? 첫 번째 인스턴스 또는 모든 인스턴스를 제거 하시겠습니까?
BenAlabaster

예, 중복 값이 ​​없습니다. 어떻게 생각하십니까?
ahmed

ahmed 아닙니까? 아뇨, 아십니까? (영어를 모욕하지 않고 설명을
요구함

@Malfist-죄송합니다 :), 중복 된 값에 관심이 없음을 의미합니다. 내 경우에는 값이 하나도 없기 때문에 다시 감사합니다.
ahmed

3
이 예제 프로그램 에서 볼 수 있듯이 C #의 배열에서 항목을 제거 할 수 없습니다 . 당신이 할 수있는 일은 새로운 배열을 만들고, 원래 배열의 일부 요소 만 복사하고 원래 변수에 다시 할당하는 것입니다. 이것이 모든 답변에서 이루어집니다.
Nicola Musatti

답변:


340

색인을 몰라도 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 예제를 참조해야합니다.


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

21

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

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

11

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

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

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

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


List <T>는 ArrayList보다 낫습니다.
Mike Scott

1
이 답변은 더 많은 투표를 받아야합니다. List<T>ArrayList보다 더 나은 @MikeScott에 전적으로 동의하지만 OP가 원래 List. OP는 아무도 눈치 채지 못한 것으로 보이는 배열의 크기를 조정할 수 없으며, 다른 사람은 전혀 눈치 채지 못했던 다른 크기의 유형을 대신 사용하려고 시도했지만 다른 문제로 넘어갔습니다. 알아 차렸다.
phoog

5

요소의 모든 인스턴스를 제거하려면 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();
}

5

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

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

    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);
    }

4
크기 조정은 실제로 데이터를 새 배열에 복사합니다 (전달 된 새 크기가 전달 된 배열의 길이가 아닌 경우). 전달 된 배열 인스턴스의 크기는 변경되지 않습니다. 이것이 참조 매개 변수 인 이유입니다. referencesource.microsoft.com/mscorlib/R/71074deaf111c4e3.html을 참조 하십시오 .
phoog

5

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

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


이 경우 가장 좋은 해결책이라고 생각합니다.
Bogdan Doicin

3

일반 확장으로 2.0 호환 :

using System.Collections.Generic;
public static class Extensions {
    //=========================================================================
    // Removes all instances of [itemToRemove] from array [original]
    // Returns the new array, without modifying [original] directly
    // .Net2.0-compatible
    public static T[] RemoveFromArray<T> (this T[] original, T itemToRemove) {  
        int numIdx = System.Array.IndexOf(original, itemToRemove);
        if (numIdx == -1) return original;
        List<T> tmp = new List<T>(original);
        tmp.RemoveAt(numIdx);
        return tmp.ToArray();
    }
}

용법:

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

0

' 사전 키 값을 기준으로 문자열에서 항목을 제거합니다. 'VB.net 코드

 Dim stringArr As String() = "file1,file2,file3,file4,file5,file6".Split(","c)
 Dim test As Dictionary(Of String, String) = New Dictionary(Of String, String)
 test.Add("file3", "description")
 test.Add("file5", "description")
 stringArr = stringArr.Except(test.Keys).ToArray()

0

이 방법으로 할 수 있습니다 :

int[] numbers= {1,3,4,9,2};     
List<int> lst_numbers = new List<int>(numbers);
int required_number = 4;
int i = 0;
foreach (int number in lst_numbers)
{              
    if(number == required_number)
    {
        break;
    }
    i++;
}
lst_numbers.RemoveAt(i);
numbers = lst_numbers.ToArray();        
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.