- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我最近读到 .NET 4 的 System.String 类有一个新的 Join 方法重载。这个新的重载需要一个分隔符和一个 IEnumerable<T>
。它允许将任意集合连接成单个字符串,而无需转换为中间字符串数组。
太棒了!这意味着我现在可以这样做:
var evenNums = Enumerable.Range(1, 100)
.Where(i => i%2 == 0);
var list = string.Join(",",evenNums);
...而不是这个:
var evenNums = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.Select(i => i.ToString())
.ToArray();
var list = string.Join(",", evenNums);
...因此节省了将每个项目转换为字符串,然后分配数组的时间。
但是,作为一般函数式编程风格的粉丝,尤其是 C# 中的方法链,我更希望能够编写如下内容:
var list = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.string.Join(",");
虽然这不是合法的 C#。是的,我可以 do it with Enumerable.Aggregate
,是的,我可以 do it with my own Join extension method ),但这些方法难以阅读/效率低下并且感觉像是逃避(分别)所以我想尝试以不同的方式来做。到目前为止,我最接近的是:
var list = Enumerable.Range(1, 100)
.Where(i => i%2 == 0)
.ApplyTo(
Functional.Curry<string, IEnumerable<object>, string>
(string.Join)(",")
);
...使用以下扩展方法:
public static class Functional
{
public static TRslt
ApplyTo<TArg, TRslt>(this TArg arg, Func<TArg, TRslt> func)
{
return func(arg);
}
public static Func<T1, Func<T2, TResult>>
Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
{
Func<Func<T1, T2, TResult>, Func<T1, Func<T2, TResult>>> curried
= f => x => y => f(x, y);
return curried(func);
}
}
这非常冗长,需要显式定义参数和字符串的返回类型。我想使用的 Join 重载依赖于 C#4 的变化特性,因为我们将其中一个参数定义为 IEnumerable 而不是 IEnumerable。
你能找到一种更简洁的方法来使用编程的方法链风格吗?
这个挑战是关于尝试在 C# 中找到一种简洁的方法来柯里化(Currying)具有多个重载的函数 - 这只是为了好玩!
最佳答案
有什么问题:
var list = string.Join(",",Enumerable.Range(1, 100).Where(i => i%2 == 0));
我真的不明白这怎么不是函数式编程。它的链接更少,是的。但是函数式程序不是关于链接,而是关于编写更多的声明性语句,这在我的书中就是这样做的。当然,如果你真的想把它链接起来,你可以这样做:What is the LINQ way to implode/join a string array?
关于c# - 挑战: Neater way of currying or partially applying C#4's string.加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2658672/
我有一张整洁的假期表,如果此类假期是经常性的(即新年),则显示日期和重复 现在,我需要计算两个日期之间的假期数。如果它是一个没有重复信息的简单日期列表(即它会显示 2000-01-01 和 2015-
背景 我最近读到 .NET 4 的 System.String 类有一个新的 Join 方法重载。这个新的重载需要一个分隔符和一个 IEnumerable。它允许将任意集合连接成单个字符串,而无需转换
jsfiddle with example 点击一个县名可以看到它的徽章出现。 我在需要时附加 div,每个 div 的背景都来自完美运行的 css sprite。我想要的是将每个添加的 div 垂直
我是一名优秀的程序员,十分优秀!