문제

이 있는 기능을 내장합니다.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);

에 더 사용할 수 있는 배열에 대한 방법 MSDN.

다른 팁

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.BlockCopyArray.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);

나는 그것을 얻을 수 없습이 훨씬 더 간단합니다.

나는 데 필요한 솔루션을 결합하는 알 수 없는 숫자의 배열입니다.

놀라게 아무도 다른 솔루션을 제공 사용 SelectManyparams.

 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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top