21

IEnumerable<string>を区切り文字列に変換するための関数型プログラミングアプローチとは何ですか?ループを使用できることはわかっていますが、関数型プログラミングに頭を悩ませようとしています。

これが私の例です:

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 に答える