【问题标题】:C# - IEnumerable to delimited stringC# - IEnumerable 到分隔字符串
【发布时间】:2010-09-15 02:12:46
【问题描述】:

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

这是我的例子:

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

var delimitedString = ??

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

【问题讨论】:

    标签: c# functional-programming


    【解决方案1】:

    这是 3.5 兼容的:

    var selectedValues = String.Join(",", (from ListItem item in checkboxList.Items where item.Selected select item.Value).ToArray());
    

    【讨论】:

      【解决方案2】:
      string.Join(", ", string[] enumerable)
      

      【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 最后一行应该是 ( sb.Length == 0 ? sb.Append(s) : sb.Append( ',' ) ).Append( s ) );
      【解决方案4】:

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

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

      【讨论】:

      • string.join 是否出于性能原因更好?从可读性的角度来看,我会说它更好。
      • 我会说是的; .ToArray() [获取字符串[]] 将使用加倍,因此没有多少中间数组 - 然后 string.Join 本质上是 StringBuilder;但是,字符串连接每次都会有一个新字符串,因此大小会伸缩。
      • 同意,这是您可以在函数式编程语言(例如 haskell)中找到的那种解决方案,但这里不是。但是掌握foldr是掌握函数式语言的关键之一。
      • 那么,这是为什么函数式语言通常性能不佳的一个例子吗?
      【解决方案5】:

      这是一种 LINQ/函数式的方法。

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

      【讨论】:

        【解决方案6】:
        var delimitedString = selectedValues.Aggregate((x,y) => x + ", " + y);
        

        【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:
          var delimitedString = string.Join(",", checkboxList.Items.Where(i => i.Selected).Select(i => i.Value).ToArray());
          

          【讨论】:

            猜你喜欢
            • 2011-03-25
            • 2013-04-18
            • 2010-11-25
            • 1970-01-01
            • 2018-04-01
            • 2011-04-04
            • 1970-01-01
            • 2011-02-06
            相关资源
            最近更新 更多