C#-IEnumerable可以分隔字符串

时间:2020-03-06 15:04:40  来源:igfitidea点击:

将" IEnumerable <string>"转换为定界字符串的功能编程方法是什么?我知道我可以使用循环,但是我想把头放在函数式编程上。

这是我的示例:

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

var delimitedString = ??

..还是我可以只在第一个var分配中执行此操作(将每个结果追加到前一个var赋值)?

解决方案

string.Join(", ", string[] enumerable)

var delimitedString = string.Join(",", checkboxList.Items.Where(i => i.Selected).Select(i => i.Value).ToArray());

好吧,在这种情况下,函数方法可能不是最适合的,仅仅是因为没有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是一个很棒的工具,但不一定总是每个工作的最佳工具)

var delimitedString = selectedValues.Aggregate((x,y) => x + ", " + y);

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

string[] toDelimit = CallSomeFunction();
return toDelimit.Aggregate((x, y) => x + "," + y);

AviewAnew是最好的答案,但是如果我们要查找的是学习如何在函数中进行思考,则应该执行的操作是使用折叠操作(或者在NET中进行汇总)。

items.Aggregate((accum, elem) => accum + ", " + elem);

这是一个带有StringBuilder的例子。不错的是,Append()返回了StringBuilder实例本身。

return list.Aggregate( new StringBuilder(), 
                               ( sb, s ) => 
                               ( sb.Length == 0 ? sb : sb.Append( ',' ) ).Append( s ) );