21

IEnumerable<string>将 a 转换为分隔字符串的函数式编程方法是什么?我知道我可以使用循环,但我正试图围绕函数式编程。

这是我的例子:

var selectedValues =
from ListItem item in checkboxList.Items
where item.Selected
select item.Value;

var delimitedString = ??

.. 或者我可以在第一个 var 分配中执行此操作(将每个结果附加到前一个结果)?

4

8 回答 8

41
string.Join(", ", string[] enumerable)
于 2008-10-03T14:29:23.830 回答
24

这是一个带有StringBuilder. 好消息是Append()返回StringBuilder实例本身。

  return list.Aggregate( new StringBuilder(), 
                               ( sb, s ) => 
                               ( sb.Length == 0 ? sb : sb.Append( ',' ) ).Append( s ) );
于 2008-10-03T15:02:07.180 回答
20
var delimitedString = selectedValues.Aggregate((x,y) => x + ", " + y);
于 2008-10-03T14:36:39.010 回答
4
var delimitedString = string.Join(",", checkboxList.Items.Where(i => i.Selected).Select(i => i.Value).ToArray());
于 2008-10-03T14:29:26.810 回答
3

AviewAnew 是最好的答案,但是如果您正在寻找的是学习如何在函数式中思考,您应该做的是使用折叠操作(或在 NET 中调用的聚合)。

items.Aggregate((accum, elem) => accum + ", " + elem);
于 2008-10-03T14:38:46.137 回答
2

好吧,在这种情况下,函数式方法可能不是最适合的,只是因为没有 LINQ“ForEach”,并且您不想使用字符串连接:您想使用 StringBuilder。您可以使用 ToArray (上面刚刚出现了一个示例),但我很想简单地使用:

    StringBuilder sb = new StringBuilder();
    foreach(ListViewItem item in checkboxList.SelectedItems) {
        if(sb.Length > 0) sb.Append(',');
        sb.Append(item.Text);
    }
    string s = sb.ToString();

不是函数式编程,但它可以工作......当然,如果您的源代码已经是 string[] 那么 string.Join 是完美的。(LINQ 是一个很棒的工具,但不一定总是适合每项工作的最佳工具)

于 2008-10-03T14:36:14.690 回答
1

这是一种 LINQ/功能性的方法。


string[] toDelimit = CallSomeFunction();
return toDelimit.Aggregate((x, y) => x + "," + y);
于 2008-10-03T14:38:31.393 回答
0

这是 3.5 兼容的:

var selectedValues = String.Join(",", (from ListItem item in checkboxList.Items where item.Selected select item.Value).ToArray());
于 2012-12-05T15:20:08.963 回答