【问题标题】:Mixing ref and params keyword is not possible?混合 ref 和 params 关键字是不可能的?
【发布时间】:2012-06-25 09:32:23
【问题描述】:

我想要一个映射函数来做到这一点:

public static void Map<T>(IEnumerable<T> src, params T[] dst)
{
    for (int i = 0; i < dst.Length; i++)
        dst[i] = src.ElementAt(i);
}

为了使这项工作 dst 还必须被声明为 ref,这似乎是不可能的。

这里用于一个虚构的单元测试:

int a = 0, b = 0, c = 0;
int[] arr = { 1, 2, 3 };
Tools.Map(arr, a, b, c);
Assert.AreEqual(a, 1);
Assert.AreEqual(b, 2);
Assert.AreEqual(c, 3);

这可能吗?它已经存在了吗?会不会是个坏主意?

编辑:换句话说,我如何给这个实现任意数量的参数:

public static void Map3<T>(IEnumerable<T> src, ref T a, ref T b, ref T c)
{
   a = src.ElementAt(0);
   b = src.ElementAt(1);
   c = src.ElementAt(2);
}

【问题讨论】:

  • 是的,这里有很多不好的东西,甚至在你的坏主意之前;p 首先,你在复制现有的功能。 (Enumerable.ToArray())。
  • 没有。转换不是从 IEnumerable 到数组,而是从 IEnumerable 到任意数量的单独变量。
  • 看不出将数组设为ref 会有什么不同。您没有在函数中为实际数组分配新值。
  • @poingpoing:这毫无意义。
  • 请查看我更新的问题。

标签: c# linq


【解决方案1】:

你不能那样做。 Params 是 C# 编译器的一种便利,它只是在现场创建一个数组,并用参数填充它。

由于数组不能包含“ref”变量,所以也不能以这种方式将“ref”传递给params。

您正在寻找某些语言所具有的“多重分配”之类的东西。如果它存在,它会像这样工作:

my (a,b,c,d) = enumerable.ToArray();

见:C#: Split string and assign result to multiple string variables

您可以考虑一组扩展方法:

public static void ReadValues<T>(this T[] array, ref T t0){
   t0 = array[0];
}
public static void ReadValues<T>(this T[] array, ref T t0, ref T t1){
   t0 = array[0];
   t1 = array[1];
}

等等,最多可以支持任意数量的参数。

这不是一个任意的数字,但 20 对于大多数用途来说应该足够高了。嘿,如果不是,那就再高一点。

那么你可以这样使用它:

enumerable.ToArray().ReadValues(var1, var2, var3);    

您甚至可以将它与 Slice 结合使用来读取任意条目:

// reads indexes 3 to 7
enumerable.ToArray().Slice(3,4).ReadValues(var1, var2,var3,var4); 

在此处查看切片:

【讨论】:

  • 你是对的。其实,我只是在寻找一种方便的变量赋值方式。
  • 经过您的编辑,这是完美的答案。我希望避免写出 t0 = arr[0] ... tn = arr[n] 但没关系。谢谢。
猜你喜欢
  • 2013-02-13
  • 2017-02-11
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多