繁体   English   中英

C# 相当于 Julia 的 map!() 方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM