[C#] 일반 배열의 요소 제거

Foo 객체 배열이 있습니다. 배열의 두 번째 요소를 어떻게 제거합니까?

RemoveAt()일반 배열 과 비슷한 것이 필요합니다 .



답변

목록을 사용하지 않으려면 다음을 수행하십시오.

var foos = new List<Foo>(array);
foos.RemoveAt(index);
return foos.ToArray();

실제로 테스트하지 않은이 확장 방법을 시도 할 수 있습니다.

public static T[] RemoveAt<T>(this T[] source, int index)
{
    T[] dest = new T[source.Length - 1];
    if( index > 0 )
        Array.Copy(source, 0, dest, 0, index);

    if( index < source.Length - 1 )
        Array.Copy(source, index + 1, dest, index, source.Length - index - 1);

    return dest;
}

그리고 그것을 다음과 같이 사용하십시오 :

Foo[] bar = GetFoos();
bar = bar.RemoveAt(2);


답변

배열의 특성상 길이는 변경할 수 없습니다. 배열 항목을 추가하거나 삭제할 수 없습니다.

한 요소보다 짧은 새 배열을 작성하고 삭제하려는 요소를 제외하고 이전 항목을 새 배열로 복사해야합니다.

따라서 배열 대신 List를 사용하는 것이 좋습니다.


답변

이 방법을 사용하여 객체 배열에서 요소를 제거합니다. 내 상황에서 배열의 길이는 작습니다. 따라서 배열이 큰 경우 다른 솔루션이 필요할 수 있습니다.

private int[] RemoveIndices(int[] IndicesArray, int RemoveAt)
{
    int[] newIndicesArray = new int[IndicesArray.Length - 1];

    int i = 0;
    int j = 0;
    while (i < IndicesArray.Length)
    {
        if (i != RemoveAt)
        {
            newIndicesArray[j] = IndicesArray[i];
            j++;
        }

        i++;
    }

    return newIndicesArray;
}


답변

LINQ 단선 솔루션 :

myArray = myArray.Where((source, index) => index != 1).ToArray();

1이 예에서, 원래의 질문에 따라, 제 2 요소 (와 -이 예에서 요소의 인덱스를 제거하는 1C # 제로 어레이 인덱스에서 두 번째 요소이다).

보다 완전한 예 :

string[] myArray = { "a", "b", "c", "d", "e" };
int indexToRemove = 1;
myArray = myArray.Where((source, index) => index != indexToRemove).ToArray();

해당 스 니펫을 실행 한 후의 값은 myArray입니다 { "a", "c", "d", "e" }.


답변

이것은 다음과 같은 배열 인스턴스를 사용하여 다른 배열에 복사하지 않고 .Net 3.5에서 배열 요소를 삭제하는 방법입니다 Array.Resize<T>.

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


답변

다음은 .NET 프레임 워크 버전 1.0에서 작동하며 일반 유형이 필요하지 않은 이전 버전 입니다.

public static Array RemoveAt(Array source, int index)
{
    if (source == null)
        throw new ArgumentNullException("source");

    if (0 > index || index >= source.Length)
        throw new ArgumentOutOfRangeException("index", index, "index is outside the bounds of source array");

    Array dest = Array.CreateInstance(source.GetType().GetElementType(), source.Length - 1);
    Array.Copy(source, 0, dest, 0, index);
    Array.Copy(source, index + 1, dest, index, source.Length - index - 1);

    return dest;
}

이것은 다음과 같이 사용됩니다 :

class Program
{
    static void Main(string[] args)
    {
        string[] x = new string[20];
        for (int i = 0; i < x.Length; i++)
            x[i] = (i+1).ToString();

        string[] y = (string[])MyArrayFunctions.RemoveAt(x, 3);

        for (int i = 0; i < y.Length; i++)
            Console.WriteLine(y[i]);
    }
}


답변

이 문제를 해결하는 방법은 아니지만 상황이 사소하고 시간을 소중하게 생각하면 nullable 유형에 대해 시도해 볼 수 있습니다.

Foos[index] = null

나중에 논리에서 null 항목을 확인하십시오.