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