如何在参数对象 [] 前面插入对象

本文关键字:对象 前面 插入 参数 | 更新日期: 2023-09-27 18:30:30

public class bar:foo
{
    public bar(int something, params object[] parameters)
        :base(something, parameters) //foo will receive {int, object[]}, not what i want
    {
    }
}
public class foo
{
    public foo(params object[] parameters)
    {
    }
}

所以基本上我想在我传递给基类的 params 数组前面再附加一个对象。 假设我调用 bar(1, 2, 3, 4, 5) 我希望 foo receive {1, 2, 3, 4, 5}为参数,而不是 {1, {2, 3, 4, 5}},这就是上面的代码给我的。

如何在参数对象 [] 前面插入对象

解决方案是创建一个包含第一个元素 + 原始数组中的元素的新数组,并将新数组传递给另一个方法。

为此,您可以创建一个保存第一个参数的新数组,并使用 Concat 创建一个包含此参数和原始数组的集合,然后将该集合转换回数组。

这个表达式可以做到:

new object[] { something }.Concat(parameters).ToArray()

因此,构造函数定义将如下所示:

public bar(int something, params object[] parameters)
    :base(new object[] { something }.Concat(parameters).ToArray())
{
}

老派:

  • 创建数组 [N + 1]
  • 复制第一个参数
  • 之后复制/追加参数数组。

有时您不需要 LINQ,在这种情况下,数组的大小是已知的。

public static T[] Append<T>(this T first, params T[] items)
{
    T[] result = new T[items.Length + 1];
    result[0] = first;
    items.CopyTo(result, 1);
    return result;
}

(对于非常老的学校,请使用 Object 而不是 T)

我喜欢扩展;到目前为止,两个答案都有:

public static class ObjectExtensions
{
    public static object[] PrependToParamArray(this object me, params object[] args)
    {
        return new[] {me}.Concat(args).ToArray();
    }
}

通常数组是不受欢迎的。更好的解决方案是使用LinkedList,它提供了添加前端的方法

埃迪特

如果需要保留变量参数,则可以使用 .Union.ToArray() 方法在 c# 数组上可用