混合ref和params关键字是不可能的?

时间:2012-06-25 09:32:23

标签: c# linq

我想有一个执行此操作的映射函数:

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

1 个答案:

答案 0 :(得分:4)

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

由于数组不能包含&#34; ref&#34;变量,你也不能通过&#34; ref&#34;以这种方式参考。

您正在寻找类似&#34;多项任务&#34;有些语言有。如果存在,它将起作用:

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

请参见切片: