C# 向数组中添加元素

C# 向数组中添加元素,c#,.net,linq,arrays,C#,.net,Linq,Arrays,我正在以数组的形式从源读取数据。a[n] 我需要向数组中再添加一个元素 一旦得到数组,我就创建一个容量为n+1的新数组,将所有元素复制到新数组中,并将新元素作为数组的最后一个元素 我能做到 有更好的方法吗?特别是使用Linq?时,您可以使用数组初始化列表 var stuff = new List<object>( a ); stuff.Add( moreStuff ); var stuff=新列表(a); 填充。添加(更多填充); 使用列表,然后调用myList.Add(item)

我正在以数组的形式从源读取数据。a[n]

我需要向数组中再添加一个元素

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

我能做到


有更好的方法吗?特别是使用Linq?

时,您可以使用数组初始化列表

var stuff = new List<object>( a );
stuff.Add( moreStuff );
var stuff=新列表(a);
填充。添加(更多填充);
使用
列表
,然后调用
myList.Add(item)


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

如果要使用LINQ将数组组合在一起,可以使用Concat:

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

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

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

如果你发现你需要经常调整数组大小,你应该考虑使用<代码> ARARYLIST/<代码>,或者如果可能的话,使用强类型<代码>列表< /> > < /P> 编辑: 如果只是从无法控制的方法获取数组,但在代码中可以使用

IEnumerable
,则可以使用LINQ延迟枚举并节省额外的数组分配:

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

//snip

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

只有在调用
ToArray()
时,我们才会产生额外的开销。否则,我们只需在原始数组上执行一次枚举,然后在最后偷偷插入额外的项。

您可以使用
数组。为此,请调整
的大小:

它基本上完成了您手动完成的操作,但有点整洁


如果要定期向数组中添加多个元素,我建议移动到列表中,因为这样插入效率更高。

可以使用ToArray和ToList Linq命令

下面是一个通用方法,它将返回一个新数组,该数组将是包含新项的原始数组的副本

public static T[] AddItem<T>( T[] array, T item )
{
    List<T> list = array.ToList();
    list.Add( item );
    return list.ToArray();
}
公共静态T[]附加项(T[]数组,T项)
{
List=array.ToList();
列表。添加(项目);
return list.ToArray();
}
下面是一个将项添加到数组中的通用扩展方法。(该阵列将是内存中的新阵列,因此可能会有副作用)

公共静态void AddItem(此T[]数组,T项)
{
List=array.ToList();
列表。添加(项目);
array=list.ToArray();/*未测试,可能无法编译*/
}
C#产量(无需额外存储) 使用允许您返回阵列和更多阵列,而无需分配额外存储。在生成原始数组的每个元素后,您可以轻松地插入任何额外元素,如下所示:

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...
}

在这种情况下,没有真正需要退出LINQ,因为收益率声明很简单,完全适合您的需要

如果必须使用相同类型的数组{ArrayVar1,ArrayVar2},则可以使用类似的方法

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

使用数组方法调整大小和收缩副本的示例。不需要制作额外的数组

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

你应该使用强类型列表。用
SomeType
替换
object
,OP没有说明他使用的是什么类型,我假设他知道如何使用泛型列表。这真的离题了。如果OP问的问题很基本,就像有什么方法可以调整数组大小一样,那么你不应该假设他对泛型集合的了解,或者他对泛型集合中强制转换/装箱/拆箱对象的性能问题的了解。FFS,声明列表会破坏通用集合中的整个要点!此时,您最好使用Arraylist。如果OP不了解泛型的用途,我的建议是完全停止此项目并开始阅读初学者教程。不幸的是,数据源返回了数组,我无能为力。@用户,是什么阻止您在收到数据源后将其更改为列表?为什么要将其保留为一个不灵活的数组?因为我必须将其存储为一个数组。因此,将其更改为列表,然后再返回到数组是一种过分的做法,不是吗?@RexM so Add()方法的工作方式与创建新数组的工作方式相同?@entropy您指的是什么
Add
方法?这比简单地将旧数组直接复制到新数组稍微差一些。我同意这可能不是处理此问题的最有效方法。我喜欢你使用Concat方法。我忽略了那个。我对你的答案投了赞成票。你真的测试过这种扩展方法吗?因为如果它能工作,就意味着
这个
参数通过引用传递,这会让我感到惊讶。@Isaac,不幸的是我没有测试这个例程,这是事后才想到的。我更新了代码示例,让别人知道它可能无法工作。我决定离开它,因为我认为扩展方法可能仍然是一个很好的解决方案。请不要在标题中添加像“C#”这样的标签。只需将标签留在标签中,标签就属于这里。
var arrayList = ArrayVar1.ToList();
arrayList.AddRange(ArrayVar2); // or for single element use arrayList.Add(Var2);
ArrayVar1=arrayList.ToArray();
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);