将元素添加到数组中

时间:2010-06-30 03:01:39

标签: c# .net linq arrays

我正在从源中读取数据作为数组。一个[N]

我需要在数组中添加一个元素。

一旦我得到数组,我创建一个容量为n + 1的新数组,并将所有元素复制到新数组,并将新元素作为数组的最后一个元素。

我可以这样做。

有更好的方法吗?尤其是Linq?

9 个答案:

答案 0 :(得分:8)

你所描述的实际上是唯一的方法。数组无法在.NET中调整大小,因此我们必须分配一个新数组并将旧数组复制到其中。例如,这就是Array.Resize的工作原理。 LINQ在这里并不是真正的帮助,如果是这样的话,它只会将现有阵列投射到新的阵列中 - 这正是我们刚刚描述的。

如果您发现需要经常调整阵列大小,则应考虑使用ArrayList或尽可能使用强类型List<T>

修改: 如果您只是从某种方法获取数组而无法控制,但在代码中您可以使用IEnumerable<T>代替,您可以使用LINQ来延迟枚举并节省额外的数组分配:

var mySequence = originalArray.Concat(new[]{myobj});

//snip

foreach(var item in mySequence)
{
    //do stuff
}

只有在调用ToArray()时才会产生额外的开销。否则,我们只是对原始数组进行单个枚举,然后在最后隐藏额外的项目。

答案 1 :(得分:6)

如果要使用LINQ将阵列放在一起,可以使用Concat:

var combined = array1.Concat(new[] { element }).ToArray();

但是,您现在正在为您的集合创建许多不同的数组。更好的选择是使用List。它将由单个阵列支持并自动扩展。

答案 2 :(得分:5)

C#产量(无需额外存储)

使用C# yield可以在不分配额外存储空间的情况下返回阵列等。在产生原始数组的每个元素之后,您可以轻松地插入任何额外的元素:

IEnumerable<int> GetEverything() {

    // first return the entire original array
    foreach(int num in arrNumbers)
        yield return num;

    // then slip in extra element at the end
    yield return 5;   // yield even more elements if you want...
}

然后你可以像这样使用它:

foreach (int n in GetEverything())
    Console.WriteLine(n);

在这种情况下,没有必要提取LINQ,因为yield语句很简单,非常适合您的需要。

答案 3 :(得分:3)

您可以使用该数组初始化列表。

var stuff = new List<object>( a );
stuff.Add( moreStuff );

答案 4 :(得分:3)

您可以使用Array.Resizehttp://msdn.microsoft.com/en-us/library/bb348051.aspx

它基本上是你手动完成的,但有点整洁。

如果您定期向阵列添加多个元素,我建议您移动到列表,因为它会更有效地插入。

答案 5 :(得分:0)

改为使用List<T>,并致电myList.Add(item)

编辑:如果您的意思是将数据作为数组(不将数据读入数据),请使用List的构造函数从数组中复制。

答案 6 :(得分:0)

您可以使用ToArray和ToList Linq命令。

这是一个通用方法,它将返回一个新数组,该数组将是原始项目的副本。

public static T[] AddItem<T>( T[] array, T item )
{
    List<T> list = array.ToList();
    list.Add( item );
    return list.ToArray();
}

这是将项添加到数组中的通用扩展方法。 (该数组在内存中将是一个新的,因此可能有副作用)。

public static void AddItem<T>( this T[] array, T item )
{
    List<T> list = array.ToList();
    list.Add( item );
    array = list.ToArray(); /* Untested, this may not compile! */
}

答案 7 :(得分:0)

你可以使用类似的东西,如果你需要相同类型的数组{ArrayVar1,ArrayVar2}

var arrayList = ArrayVar1.ToList();
arrayList.AddRange(ArrayVar2); // or for single element use arrayList.Add(Var2);
ArrayVar1=arrayList.ToArray();

答案 8 :(得分:0)

使用数组方法Resize和ConstrinedCopy的示例。无需制作额外的数组。

Filter[] filterA = new Filter[] {
      new Filter() { field = "trans_date", Data = "2018-01-01", Op = "gt" }
      , new Filter() { field = "trans_date", Data = "2018-01-02", Op = "gt" }
      , new Filter() { field = "trans_date", Data = "2018-01-03", Op = "gt" }
};

Filter[] filterB = new Filter[] {
      new Filter() { field = "trans_date", Data = "2018-01-04", Op = "gt" }
      , new Filter() { field = "trans_date", Data = "2018-01-05", Op = "gt" }
};


//resizing the original array to hold all the new elements.
Array.Resize(ref filterA, filterA.Length + filterB.Length);

//take the items from filterB and place them in filterA
Array.ConstrainedCopy(filterB, 0, filterA, 3, 2);