我想要一个可以执行此操作的映射函数:
public static void Map<T>(IEnumerable<T> src, params T[] dst)
{
for (int i = 0; i < dst.Length; i++)
dst[i] = src.ElementAt(i);
}
Run Code Online (Sandbox Code Playgroud)
为了使这项工作正常进行, 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);
Run Code Online (Sandbox Code Playgroud)
这有可能吗?它已经存在了吗?这是一个坏主意吗?
编辑:换句话说,我如何为该实现提供任意数量的参数:
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);
}
Run Code Online (Sandbox Code Playgroud)
你不能那样做。Params 为 C# 编译器带来了便利,它只是当场创建一个数组,并用参数填充它。
由于数组不能包含“ref”变量,因此也不能以这种方式将“ref”传递给 params。
您正在寻找某些语言具有的“多重赋值”之类的东西。如果它存在的话,它会像这样工作:
my (a,b,c,d) = enumerable.ToArray();
Run Code Online (Sandbox Code Playgroud)
您可以考虑一组扩展方法:
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];
}
Run Code Online (Sandbox Code Playgroud)
等等,直到您想要支持的参数为止。
这不是一个任意数字,但 20 对于大多数用途来说应该足够高了。嘿,如果不是,就走得更高。
然后你可以像这样使用它:
enumerable.ToArray().ReadValues(var1, var2, var3);
Run Code Online (Sandbox Code Playgroud)
您甚至可以将其与 Slice 结合起来读取任意条目:
// reads indexes 3 to 7
enumerable.ToArray().Slice(3,4).ReadValues(var1, var2,var3,var4);
Run Code Online (Sandbox Code Playgroud)
请参阅此处的切片:
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |