C#将扩展追加方法添加到T类型的类数组中
用这个来回答问题“”我试图用它来编写一个泛型扩展,将元素附加到。只有使用该方法才能很好地工作,下面的示例为我的 但是,当我尝试使用下面描述的ArrayExtension方法时,该方法确实会在该方法中调整我的数组大小,但是当它返回数组时,数组是否保持不变 我的扩展课C#将扩展追加方法添加到T类型的类数组中,c#,arrays,generics,append,extension-methods,C#,Arrays,Generics,Append,Extension Methods,用这个来回答问题“”我试图用它来编写一个泛型扩展,将元素附加到。只有使用该方法才能很好地工作,下面的示例为我的 但是,当我尝试使用下面描述的ArrayExtension方法时,该方法确实会在该方法中调整我的数组大小,但是当它返回数组时,数组是否保持不变 我的扩展课 public static class ArrayExtensions { public static void Append<T>(this T[] array, T append) {
public static class ArrayExtensions
{
public static void Append<T>(this T[] array, T append)
{
Array.Resize(ref array, array.Length + 1);
array[array.Length - 1] = append; // < Adds an extra element to my array
}
}
当方法返回时,添加的元素不存在。我错过了什么
更新
正如所指出的,这个问题以前在这里被提出并得到了回答。我接受上一个问题“”作为对我问题的回答
更新2
由于如果在扩展方法中使用了返回方法,那么它确实违反了框架中类似类的预期行为,即Append()修改对象本身,因此我对扩展方法做了一些更改,以防止错误使用它。感谢@NineBerry指出这一点
我还添加了允许同时添加多个元素
public static class ArrayExtensions
{
/// <summary>
/// Creates a copy of an object array and adds the extra elements to the created copy
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="add">Elemet to add to the created copy</param>
/// <returns></returns>
public static T[] CopyAddElements<T>(this T[] array, params T[] add)
{
for (int i = 0; i < add.Length; i++)
{
Array.Resize(ref array, array.Length + 1);
array[array.Length - 1] = add[i];
}
return array;
}
}
公共静态类ArrayExtensions
{
///
///创建对象数组的副本,并将额外的元素添加到创建的副本中
///
///
///
///要添加到已创建副本的元素
///
公共静态T[]CopyAddElements(此T[]数组,参数T[]add)
{
for(int i=0;i
用法
string[]数组=新字符串[]{“Foo”,“Bar”};
array=array.CopyAddElements(“Baz”、“Foobar”);
for(int i=0;i
数组。调整大小
创建一个新数组。这就是为什么必须使用ref
关键字将数组传递到array.Resize
。因此,从Array.Resize
返回后,变量Array
引用不同的对象
没有办法使用扩展方法来完成您要做的事情
为什么不简单地使用列表而不是数组呢?使用
Array.Resize
是一项非常昂贵的操作。这意味着每次调用新数组时,都要分配新内存并将数据从旧数组复制到新数组,以增加数组长度 数组。调整大小
创建一个新数组。这就是为什么必须使用ref
关键字将数组传递到array.Resize
。因此,从Array.Resize
返回后,变量Array
引用不同的对象
没有办法使用扩展方法来完成您要做的事情
为什么不简单地使用列表而不是数组呢?使用
Array.Resize
是一项非常昂贵的操作。这意味着每次调用新数组时,都要分配新内存并将数据从旧数组复制到新数组,以增加数组长度 与您的直觉相反,此
参数不是通过隐式的ref
传递的,也不允许向其添加ref
。另请参见讨论与您的直觉相反,此
参数未通过隐式ref
传递,也不允许向其添加ref
。另请参见讨论实际发生的情况是
array.Append("Baz");
翻译成
ArrayExtensions.Append( array, "Baz" );
这意味着对array
的引用是通过value传入的,因此在Append
方法中,您使用引用的副本。然后,Array.Resize
方法将这个新变量作为ref
,在内存中创建一个新数组,并将变量更改为指向它。不幸的是,此仅更改此变量,而不是原始变量
您可以将新创建的数组作为返回值返回,也可以创建一个使用
ref
而不是扩展方法的静态方法。实际情况是
array.Append("Baz");
翻译成
ArrayExtensions.Append( array, "Baz" );
这意味着对array
的引用是通过value传入的,因此在Append
方法中,您使用引用的副本。然后,Array.Resize
方法将这个新变量作为ref
,在内存中创建一个新数组,并将变量更改为指向它。不幸的是,此仅更改此变量,而不是原始变量
您可以将新创建的数组作为返回值返回,也可以创建一个使用
ref
而不是扩展方法的静态方法。请将建议List
作为答案的第一句话。这才是真正的解决办法。请在回答的第一句话中列出建议。这才是真正的解决方案。Array.Resize是一个骗局。它实际上是一个新对象的副本。因此,您需要一个ref参数来影响实际参数。Array.Resize是一个骗局。它实际上是一个新对象的副本。从这里可以看出,您需要一个ref参数来对实际参数产生影响。
ArrayExtensions.Append( array, "Baz" );