Создание массива из существующего - PullRequest
0 голосов
/ 22 декабря 2011

Это код:

class Program
{
    void Add2Array(object arr, object item)
    {
        if (arr.GetType() == typeof(string[]))
        {
            int iLen = (arr as Array).Length;
            var c = Array.CreateInstance(typeof (String), 3);
            Array v = Array.CreateInstance((arr as Array).GetValue(0).GetType(), iLen+1); // this works but when if arr is empty it wont work
            Array.Copy(ar, v, iLen);
            v.SetValue(item, iLen);
        }
    }
    public string[] sarr = new string[1];

    static void Main(string[] args)
    {
        Program p = new Program();
        p.sarr[0] = "String Item";
        p.Add2Array(p.sarr, "New string item");
    }
}

Я хочу создать метод, который может принимать массивы любого типа и помещать в них новый элемент. Приведенный выше код является моим решением (если вы знаете лучше, пожалуйста, поделитесь), и если параметр arr не имеет элемента, он не будет работать должным образом. Потому что, если я использую этот Array.CreateInstance(arr.GetType(),3), он создаст новый массив, подобный этому v.GetType() => string[2][], потому что arr является строковым массивом, и если я создаю с тем же типом, он возвращает двухмерный массив.

Как мне расширить массив (заданный в качестве параметра) и добавить в него новый элемент?

Ответы [ 2 ]

5 голосов
/ 22 декабря 2011
T[] Add2Array<T>(T[] arr, T item)
{
   return arr.Concat(new[]{item}).ToArray();
}
3 голосов
/ 22 декабря 2011

Массив не может быть расширен.Единственное, что вы можете сделать, это скопировать данные в новый массив, который больше исходного, и добавить данные.

Кстати, почему бы не использовать List <>?

using System;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            int[] x = new int[]{2,3,5};
            int[] y = new ArrayExpander().AddItem(x, 0);

            foreach (var i in y)
            {
                Console.Write(i);
            }
        }
    }

    class ArrayExpander
    {
        public T[] AddItem<T>(T[] source, T item)
        {
            var destination = new T[source.Length + 1];
            Array.Copy(source, destination, source.Length);
            destination[source.Length] = item;
            return destination;
        }
    }
}
...