문제
이 있는 기능을 내장합니다.NET2.0 는 두 가지 배열 및 병합으로 그들을 배열이 하나?
의 배열은 모두 동일한 유형이 있습니다.나는 이러한 배열에서 널리 사용되는 기능을 내 코드 베이스하고 수정할 수 없는 함수 데이터를 반환하는 다른 형식입니다.
내가 찾는 것을 방지하 쓰는 내 자신의 기능을 달성이 가능한 경우.
해결책
는 경우 조작할 수 있는 하나의 배열의 크기를 조정할 수 있습니다 그것을 실행하기 전에 복사:
T[] array1 = getOneArray();
T[] array2 = getAnotherArray();
int array1OriginalLength = array1.Length;
Array.Resize<T>(ref array1, array1OriginalLength + array2.Length);
Array.Copy(array2, 0, array1, array1OriginalLength, array2.Length);
그렇지 않으면,당신이 할 수 있는 새로운 배열
T[] array1 = getOneArray();
T[] array2 = getAnotherArray();
T[] newArray = new T[array1.Length + array2.Length];
Array.Copy(array1, newArray, array1.Length);
Array.Copy(array2, 0, newArray, array1.Length, array2.Length);
다른 팁
C#3.0 를 사용할 수 있습 LINQ 의 Concat 방법 이를 위해 쉽게:
int[] front = { 1, 2, 3, 4 };
int[] back = { 5, 6, 7, 8 };
int[] combined = front.Concat(back).ToArray();
C#2.0 없는 이러한 직접적인 방법이지만,배열입니다.사본은 아마도 최고의 솔루션:
int[] front = { 1, 2, 3, 4 };
int[] back = { 5, 6, 7, 8 };
int[] combined = new int[front.Length + back.Length];
Array.Copy(front, combined, front.Length);
Array.Copy(back, 0, combined, front.Length, back.Length);
이다 쉽게 사용할 수 있을 구현하의 자신의 버전 Concat
.
사 LINQ:
var arr1 = new[] { 1, 2, 3, 4, 5 };
var arr2 = new[] { 6, 7, 8, 9, 0 };
var arr = arr1.Union(arr2).ToArray();
계속 마음이 중복되는 용어를 제거합니다.을 유지하려는 경우,중복 사용 Concat.
당신이 원하지 않는 경우 중복을 제거하도록,그 이
사용 LINQ:
var arr1 = new[] { 1, 2, 3, 4, 5 };
var arr2 = new[] { 6, 7, 8, 9, 0 };
var arr = arr1.Concat(arr2).ToArray();
먼저,확인을 묻는 질문에"내가 정말 배열을 사용하여 여기서"?
지 않는 한 당신이 무언가를 건설하고 속도가 최선의 중요성,입력한 목록처럼, List<int>
아마도 갈 수있는 방법입니다.만 시간이 나는 이제까지 배열을 사용하는 바이트 배열을 전송할 때는 물건 네트워크를 통해.다른 것보다,나는 결코 있습니다.
쉽게 될 것을 사용하여 LINQ:
var array = new string[] { "test" }.ToList();
var array1 = new string[] { "test" }.ToList();
array.AddRange(array1);
var result = array.ToArray();
첫째 변환 배열을 나열하고 그들을 병합...후에는 그냥 변환 목록에 다시 배열:)
나는 당신이 사용할 수 있는 배열입니다.복사 니다.그것은 소스 지수 및 대상 지수는 그래서 당신이 할 수 있어야한 추가 하나의 배열합니다.이동해야 하는 경우보다 더 복잡한에 추가하나 다른 이 되지 않을 수 있습니다 오른쪽에 당신을위한 도구입니다.
가정 대상 배열은 충분한 공간이, Array.Copy()
작동합니다.수도 있습니다 사용하십시오 List<T>
그 .AddRange()
방법입니다.
개인적으로,내가 선호하는 내 자신의 언어 확장자,나는 추가 또는 제거한 급속한 prototyping.
다음 예에 대한 문자열입니다.
//resides in IEnumerableStringExtensions.cs
public static class IEnumerableStringExtensions
{
public static IEnumerable<string> Append(this string[] arrayInitial, string[] arrayToAppend)
{
string[] ret = new string[arrayInitial.Length + arrayToAppend.Length];
arrayInitial.CopyTo(ret, 0);
arrayToAppend.CopyTo(ret, arrayInitial.Length);
return ret;
}
}
하는 것보다 훨씬 빠릅니다 LINQ 및 Concat.빠른 여전히 사용하는 사용자 정의 IEnumerable
형 래퍼에 저장하는 참조/의 포인터 배열 전달할 수 있을 반복을 통해 전체 컬렉션 그것이 있다면 정상적인 배열입니다.(에서 유용한 HPC,그래픽 처리,그래픽 렌더링하...)
귀하의 코드:
var someStringArray = new[]{"a", "b", "c"};
var someStringArray2 = new[]{"d", "e", "f"};
someStringArray.Append(someStringArray2 ); //contains a,b,c,d,e,f
대체 코드고 제네릭 버전을 참조하십시오: https://gist.github.com/lsauer/7919764
참고: 이를 반환합을 확장 취소페 개체입니다.를 반환하는 확장된 개체는 조금 느려집니다.
나는 컴파일러한 확장은 2002 년 이후로 많은 것을 도움이 되는 사람들에 CodeProject 과'유래'.나는 이 곧 링크를 넣어합니다.
모든 사람은 이미 자신의 말을 하지만 생각이 더 읽기보다는"사용 확장자법"접근 방식은:
var arr1 = new[] { 1, 2, 3, 4, 5 };
var arr2 = new[] { 6, 7, 8, 9, 0 };
var arr = Queryable.Concat(arr1, arr2).ToArray();
그러나 그것은 경우에만 사용할 수 있습을 함께 데리고 2 배열입니다.
경우 다른 사람이 찾고있는 방법을 병합하는 두 개의 이미지를 바이트 배열:
private void LoadImage()
{
string src = string.empty;
byte[] mergedImageData = new byte[0];
mergedImageData = MergeTwoImageByteArrays(watermarkByteArray, backgroundImageByteArray);
src = "data:image/png;base64," + Convert.ToBase64String(mergedImageData);
MyImage.ImageUrl = src;
}
private byte[] MergeTwoImageByteArrays(byte[] imageBytes, byte[] imageBaseBytes)
{
byte[] mergedImageData = new byte[0];
using (var msBase = new MemoryStream(imageBaseBytes))
{
System.Drawing.Image imgBase = System.Drawing.Image.FromStream(msBase);
Graphics gBase = Graphics.FromImage(imgBase);
using (var msInfo = new MemoryStream(imageBytes))
{
System.Drawing.Image imgInfo = System.Drawing.Image.FromStream(msInfo);
Graphics gInfo = Graphics.FromImage(imgInfo);
gBase.DrawImage(imgInfo, new Point(0, 0));
//imgBase.Save(Server.MapPath("_____testImg.png"), ImageFormat.Png);
MemoryStream mergedImageStream = new MemoryStream();
imgBase.Save(mergedImageStream, ImageFormat.Png);
mergedImageData = mergedImageStream.ToArray();
mergedImageStream.Close();
}
}
return mergedImageData;
}
단지 그것으로 언급 옵션:을 경우 배열 작업하는 기본 형식–Boolean(bool),Char,SByte,바,Int16(short),UInt16,Int32(int),UInt32,Int64(긴),UInt64,IntPtr,UIntPtr,단일 또는 이중할 수 있습(또는?) 을 사용하여 시험 버퍼입니다.BlockCopy.에 따라 MSDN 페이지 버퍼 클래스:
이 클래스는 더 나은 성능을 제공합을 조작하기 위한 기본 형식보다는 유사한 방법에 시스템입니다.배열 클래스입니다.
를 사용하는 C#2.0 예에서@OwenP 의 응답 시작점으로,그것은 다음과 같이 작동합니다.
int[] front = { 1, 2, 3, 4 };
int[] back = { 5, 6, 7, 8 };
int[] combined = new int[front.Length + back.Length];
Buffer.BlockCopy(front, 0, combined, 0, front.Length);
Buffer.BlockCopy(back, 0, combined, front.Length, back.Length);
거의 모든 차이는 구문에서 사 Buffer.BlockCopy
고 Array.Copy
는@OwenP 사용되지만,이것은 빠르게 처리 될 수 있습니다(경우에도 약간만).
여기에 간단한 예제를 사용하여 배열입니다.CopyTo.내가 생각하는 당신의 질문에 대답하고의 예를 보여줍니다 CopyTo 사용-나는 항상 당황 필요로 할 때 이 기능을 사용하기 때문에 도움이 조금 불분명-인덱스에서 위치를 대상 배열을 삽입이 발생합니다.
int[] xSrc1 = new int[3] { 0, 1, 2 };
int[] xSrc2 = new int[5] { 3, 4, 5, 6 , 7 };
int[] xAll = new int[xSrc1.Length + xSrc2.Length];
xSrc1.CopyTo(xAll, 0);
xSrc2.CopyTo(xAll, xSrc1.Length);
나는 그것을 얻을 수 없습이 훨씬 더 간단합니다.
나는 데 필요한 솔루션을 결합하는 알 수 없는 숫자의 배열입니다.
놀라게 아무도 다른 솔루션을 제공 사용 SelectMany
가 params
.
private static T[] Combine<T>(params IEnumerable<T>[] items) =>
items.SelectMany(i => i).Distinct().ToArray();
당신이 원하지 않는 경우 별개의 항목만을 제거하 별개입니다.
public string[] Reds = new [] { "Red", "Crimson", "TrafficLightRed" };
public string[] Greens = new [] { "Green", "LimeGreen" };
public string[] Blues = new [] { "Blue", "SkyBlue", "Navy" };
public string[] Colors = Combine(Reds, Greens, Blues);
참고:은 확실히 없을 보장을 주문할 때 사용하는 별개입니다.
이것은 무엇을 합니다.작동 변수 번호의 배열입니다.
public static T[] ConcatArrays<T>(params T[][] args)
{
if (args == null)
throw new ArgumentNullException();
var offset = 0;
var newLength = args.Sum(arr => arr.Length);
var newArray = new T[newLength];
foreach (var arr in args)
{
Buffer.BlockCopy(arr, 0, newArray, offset, arr.Length);
offset += arr.Length;
}
return newArray;
}
...
var header = new byte[] { 0, 1, 2};
var data = new byte[] { 3, 4, 5, 6 };
var checksum = new byte[] {7, 0};
var newArray = ConcatArrays(header, data, checksum);
//output byte[9] { 0, 1, 2, 3, 4, 5, 6, 7, 0 }
나는 가정하고 당신이 사용하여 당신의 자신의 배열 형태로 내장되어 있습니다.NET 배열:
public string[] merge(input1, input2)
{
string[] output = new string[input1.length + input2.length];
for(int i = 0; i < output.length; i++)
{
if (i >= input1.length)
output[i] = input2[i-input1.length];
else
output[i] = input1[i];
}
return output;
}
하는 다른 방법이 사용하는 것에 내장 ArrayList 클래스입니다.
public ArrayList merge(input1, input2)
{
Arraylist output = new ArrayList();
foreach(string val in input1)
output.add(val);
foreach(string val in input2)
output.add(val);
return output;
}
모두 보기는 C#.
int [] SouceArray1 = new int[] {2,1,3};
int [] SourceArray2 = new int[] {4,5,6};
int [] targetArray = new int [SouceArray1.Length + SourceArray2.Length];
SouceArray1.CopyTo(targetArray,0);
SourceArray2.CopyTo(targetArray,SouceArray1.Length) ;
foreach (int i in targetArray) Console.WriteLine(i + " ");
를 사용하여 위의 코드를 두 배열할 수 있게 합병했다.
만들어지고 확장하는 방법을 처리 null
public static class IEnumerableExtenions
{
public static IEnumerable<T> UnionIfNotNull<T>(this IEnumerable<T> list1, IEnumerable<T> list2)
{
if (list1 != null && list2 != null)
return list1.Union(list2);
else if (list1 != null)
return list1;
else if (list2 != null)
return list2;
else return null;
}
}
이 코드는 작업에 대한 모든 경우:
int[] a1 ={3,4,5,6};
int[] a2 = {4,7,9};
int i = a1.Length-1;
int j = a2.Length-1;
int resultIndex= i+j+1;
Array.Resize(ref a2, a1.Length +a2.Length);
while(resultIndex >=0)
{
if(i != 0 && j !=0)
{
if(a1[i] > a2[j])
{
a2[resultIndex--] = a[i--];
}
else
{
a2[resultIndex--] = a[j--];
}
}
else if(i>=0 && j<=0)
{
a2[resultIndex--] = a[i--];
}
else if(j>=0 && i <=0)
{
a2[resultIndex--] = a[j--];
}
}
이것을 보십시오:
ArrayLIst al = new ArrayList();
al.AddRange(array_1);
al.AddRange(array_2);
al.AddRange(array_3);
array_4 = al.ToArray();