[英]C# equivalent of Julia's map!() method
我试图找到 C# 中与 Julia 的map!()
方法等效的方法,该方法返回类型为void
并采用 function、目标和 function 作用的集合。
我能找到的最好的东西是 C# 的Enumerable.Select()
,它将 function 作为第三个参数,并将集合作为第一个参数。 但是,它返回一个新集合而不是修改“目的地”中的集合。 这更类似于 Julia 的map()
。
没有像这样的标准,但您可以轻松地将自己的扩展方法添加到IEnumerable
以添加此功能。 例如:
public static void JuliaMap<TFrom, TTo>
(
this IEnumerable<TFrom> source,
IList<TTo> target,
Func<TFrom, TTo> selector
)
{
var next = 0;
foreach(var value in source)
{
var convertedValue = selector(value);
target[next] = convertedValue;
next++;
}
}
你怎么说:
var numbers = new[]{1, 2, 3};
var target = new string[3];
numbers.JuliaMap(target, i => (i * 2).ToString());
注意:我遗漏了任何错误处理。 例如,您需要确保目标列表足够长以获取插入的值。
LINQ
中的所有内容都经过设计,永远不会修改基础集合,并且始终创建一个新的枚举,该枚举通常随后用于实例化一个新集合。
你可以像这样写一个 helper function 来实现你想要的:
public static void SelectToDestination<TSource, TResult>(
Func<TSource, TResult> selector,
IEnumerable<TSource> source,
IList<TResult> destination)
{
int i = 0;
foreach (var item in source.Select(selector))
{
destination[i] = item;
i++;
}
}
用法如下所示:
var l1 = new List<int>() { 1, 2, 3, 4 };
var l2 = new List<int>() { 0, 0, 0, 0 };
SelectToDestination(x => x + 2, l1, l2);
foreach(var item in l2)
{
Console.Write(item + " ");
}
结果: 3 4 5 6
由于我们在方法的签名中使用了IList<T>
,因此目标也可以是一个数组,并且它可以正常工作:
public static void Main(string[] args)
{
var l1 = new List<int>() { 1, 2, 3, 4 };
var l2 = new int[4];
SelectToDestination(x => x + 2, l1, l2);
foreach(var item in l2)
{
Console.Write(item + " ");
}
}
它利用了这样一个事实,即在您调用ToArray()
或ToList()
之类的东西之前,LINQ 尚未实例化一个新集合,它只是懒惰地迭代源集合中的元素。 所以不要调用ToArray()
或ToList()
,遍历生成的IEnumerable<TResult>
并将其分配给目标。 请注意,如果您担心的话,可能有更多性能友好的方法来执行此操作。
就像 Julia 的 map 方法一样,这只有在目标集合至少同样大的情况下才有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.