[C#] c # .net의 기존 배열에 새 항목 추가

C # .net의 기존 문자열 배열에 새 항목을 추가하는 방법은 무엇입니까?

기존 데이터를 보존해야합니다.



답변

동적 크기의 배열이 필요한 경우 List를 사용합니다.

List<string> ls = new List<string>();
ls.Add("Hello");


답변

그것은 해결책이 될 수 있습니다.

Array.Resize(ref array, newsize);
array[newsize - 1] = "newvalue"

그러나 동적 크기 배열의 경우 목록도 선호합니다.


답변

LINQ 사용 :

arr = (arr ?? Enumerable.Empty<string>()).Concat(new[] { newitem }).ToArray();

나는 이것을 하나의 라이너로 사용하는 것을 좋아하며 switch 문, 간단한 if 문에 포함하거나 인수로 전달하는 것이 매우 편리합니다.

편집하다:

일부 사람들은 new[] { newitem }작은 한 항목의 임시 배열을 만들기 때문에 싫어 합니다. 다음은 Enumerable.Repeat객체를 만들 필요가없는 버전을 사용 하는 것입니다 (적어도 표면에는 없습니다. .NET 반복자는 아마도 테이블 아래에 많은 상태 머신 객체를 만들 것입니다).

arr = (arr ?? Enumerable.Empty<string>()).Concat(Enumerable.Repeat(newitem,1)).ToArray();

그리고 배열이 null시작 되지 않는 것이 확실하다면 다음과 같이 단순화 할 수 있습니다.

arr.Concat(Enumerable.Repeat(newitem,1)).ToArray();

정렬 된 컬렉션에 항목을 추가 List하려면 배열이 아닌 원하는 데이터 구조 일 것입니다.


답변

아주 오래된 질문이지만 여전히 이것을 추가하고 싶었습니다.

하나의 라이너를 찾고 있다면 아래 코드를 사용할 수 있습니다. 열거 형과 “신규”(질문이 제기 된 이후) 이니셜 라이저 구문을 허용하는 목록 생성자를 결합합니다.

myArray = new List<string>(myArray) { "add this" }.ToArray();


답변

C #에서 배열은 불변 예를 들어 string[], int[]. 즉, 크기를 조정할 수 없습니다. 완전히 새로운 배열을 만들어야합니다.

다음은 Array.Resize 의 코드입니다 .

public static void Resize<T>(ref T[] array, int newSize)
{
    if (newSize < 0)
    {
        throw new ArgumentOutOfRangeException("newSize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    }
    T[] sourceArray = array;
    if (sourceArray == null)
    {
        array = new T[newSize];
    }
    else if (sourceArray.Length != newSize)
    {
        T[] destinationArray = new T[newSize];
        Copy(sourceArray, 0, destinationArray, 0, (sourceArray.Length > newSize) ? newSize : sourceArray.Length);
        array = destinationArray;
    }
}

보시다시피 새로운 크기의 새 배열을 만들고 소스 배열의 내용을 복사하고 참조를 새 배열로 설정합니다. 이에 대한 힌트 는 첫 번째 매개 변수 의 ref 키워드입니다.

새 항목에 새 슬롯동적으로 할당 할 수있는 목록이 있습니다 . 예를 들어 List <T> 입니다. 이것들은 불변 배열을 포함하고 필요할 때 크기를 조정합니다 (List <T>는 연결된 목록 구현이 아닙니다!). ArrayList 는 Generics가없는 것과 동일합니다 ( Object 배열 사용).

LinkedList <T> 는 실제 연결 목록 구현입니다. 불행히도 LinkListNode <T> 요소 만 목록에 추가 할 수 있으므로 고유 한 목록 요소를이 노드 유형으로 랩핑해야합니다. 나는 그것의 사용이 드물다고 생각합니다.


답변

 Array.Resize(ref youur_array_name, your_array_name.Length + 1);
 your_array_name[your_array_name.Length - 1] = "new item";


답변

@Stephen Chung이 제공하는 답변을 LINQ 기반 논리를 사용하여 일반 유형을 사용하여 확장 방법을 만들 수 있습니다.

public static class CollectionHelper
{
    public static IEnumerable<T> Add<T>(this IEnumerable<T> sequence, T item)
    {
        return (sequence ?? Enumerable.Empty<T>()).Concat(new[] { item });
    }

    public static T[] AddRangeToArray<T>(this T[] sequence, T[] items)
    {
        return (sequence ?? Enumerable.Empty<T>()).Concat(items).ToArray();
    }

    public static T[] AddToArray<T>(this T[] sequence, T item)
    {
        return Add(sequence, item).ToArray();
    }

}

그런 다음 이와 같이 배열에서 직접 호출 할 수 있습니다.

    public void AddToArray(string[] options)
    {
        // Add one item
        options = options.AddToArray("New Item");

        // Add a 
        options = options.AddRangeToArray(new string[] { "one", "two", "three" });

        // Do stuff...
    }

명백히, AddRangeToArray () 메소드는 Concat ()과 동일한 기능을 가지고 있기 때문에 약간 과잉 인 것처럼 보이지만, 이렇게하면 최종 코드가 이것과 반대로 배열에서 직접 “작동”할 수 있습니다.

options = options.Concat(new string[] { "one", "two", "three" }).ToArray();