programing

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

bestprogram 2023. 5. 17. 23:32

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

편집: 만약 당신이 아직 그것을 알아내지 못했을 경우를 대비해서, 말피스트가 지적했듯이, 당신은 LINQ 코드 예제가 작동하기 위해 .NET Framework 3.5를 대상으로 해야 합니다.2.0을 목표로 하는 경우 비 LINQ 예제를 참조해야 합니다.

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

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

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

질문에 적힌 코드에 버그가 있습니다.

배열 목록에 "1" "3" "4" "9" 및 "2" 문자열이 포함되어 있습니다(공백 참고).

따라서 IndexOf(4)는 4가 int이기 때문에 아무것도 찾지 못할 것이고, 심지어 "tostring"도 그것을 "4"가 아닌 "4"로 변환할 것이고, 아무것도 제거되지 않을 것입니다.

배열 목록은 원하는 작업을 수행하는 올바른 방법입니다.

는 여기에 제 해결책을 올렸습니다.

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

    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<>또는 그와 유사합니다.

요소의 모든 인스턴스를 제거하려면 발라바스터의 대답이 맞습니다.첫 번째 항목만 제거하려면 다음과 같은 작업을 수행합니다.

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

일반 확장 버전으로 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);

다음과 같은 방법으로 수행할 수 있습니다.

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

사전 값을 기준으로 문자열에서 항목을 제거합니다.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()
    public int[] DeletePart(int position, params int[] numbers)
    {
        int[] result = new int[numbers.Length - 1];
        int z=0;

        for (int i = 0; i < numbers.Length; i++)
        {
            if (position - 1 != i)
            {
                result[z] = numbers[i];
                z++;
            }
        }
        return result;
    }

다음을 사용하여 배열 요소를 삭제할 수 있습니다.for루프 및continue문:

string[] cars = {"volvo", "benz", "ford", "bmw"};
for (int i = 0; i < cars.Length; i++)
{
    if (cars[i] == "benz")
    {
        continue;
    }
    Console.WriteLine(cars[i]);
}

언급URL : https://stackoverflow.com/questions/496896/how-to-delete-an-element-from-an-array-in-c-sharp