gpt4 book ai didi

c# - 如何使用 Linq(聚合)折叠列表?

转载 作者:行者123 更新时间:2023-12-05 02:23:30 25 4
gpt4 key购买 nike

我如何转换以下 F#(它将整数转换为字符串并替换一些字符并反转它,只是一个示例。我真正需要的是如何在 C# 中折叠到 List)使用 Aggregate 到 C#?

// Convert an integer to string, replace some characters and reverse it
let convert (aInt:int) =
let m = [ '0', 'O'; '1', 'l'; '8', 'B'; ....] |> Map.ofList
string aInt |> Seq.fold (fun a e -> m.[e]::a) [] |> String.Concat

m是否会在F#中每次调用函数convert时重新生成?

最佳答案

您不能直接将代码转换为 C#,因为许多转换在 C# 中不可用(至少在不引用 F# 的核心库的情况下不可用)。

但是,以下将提供等效的结果:

static string Convert(int value)
{
// use a Dictionary instead of F# Map
var m = new Dictionary<char, char>
{
{'0', 'O'},
{'1', '1'},
{'8', 'B'}
};

// Convert to IEnumerable<char> directly from dictionary
var valStrs = value.ToString().Select(c => m[c]);

// Build results from characters
return new String(valStrs.Reverse().ToArray());
}

请注意,您可以使用聚合来执行此操作,但您最终会做一些事情来改变聚合值,因此它的行为仍然与 F# 不同。这个变异值可能是 List<T> (如下),一个StringBuilder ,或您想要聚合的任何其他内容。我用了 List<T>因为这适用于任何类型(不仅仅是字符串/字符值),因为我怀疑这可能理解如何从折叠转换为聚合,而不是手头的这个具体问题:

static string Convert(int value)
{
var m = new Dictionary<char, char>
{
{'0', 'O'},
{'1', '1'},
{'8', 'B'}
};

var valStrs = value
.ToString()
.Reverse()
.Select(c => m[c])
.Aggregate(new List<char>(), (list, val) => { list.Add(val); return list;});
return new String(valStrs.ToArray());
}

Will m be regenerated every time when the function convert is called in F#?

没有。从 FSI 中的以下内容可以看出:

let convert (aInt:int) =
let m =
printfn "m"
[ '0', 'O'; '1', 'l'; '8', 'B'] |> Map.ofList
string aInt |> Seq.fold (fun a e -> m.[e]::a) [] |> String.Concat

调用 convert 8811;;在 FSI 中将输出:

m
val it : string = "llBB"

关于c# - 如何使用 Linq(聚合)折叠列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com