8

LINQを介して文字列ビルダーに追加したい文字列配列があります。

私が基本的に言おうとしているのは、「この配列の各項目について、このStringBuilderに行を追加する」ということです。

foreachループを使用してこれを非常に簡単に行うことができますが、次のコードは何もしないようです。私は何が欠けていますか?

stringArray.Select(x => stringBuilder.AppendLine(x));

これが機能する場所:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}
4

4 に答える 4

20

LINQy の方法でそれを行うことを主張する場合:

StringBuilder builder = StringArray.Aggregate(
                            new StringBuilder(),
                            (sb, s) => sb.AppendLine(s)
                        );

あるいは、Lukeが別の投稿のコメントで指摘したように、次のように言うこともできます。

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s));

Select機能しない理由はSelect、投影と投影の作成のためIEnumerableです。したがって、コード行

StringArray.Select(s => stringBuilder.AppendLine(s))

StringArray各反復で呼び出しを反復しませんstringBuilder.AppendLine(s)。むしろ、IEnumerable<StringBuilder>列挙できる を作成します。

私はあなたが言うことができると思います

var e = stringArray.Select(x => stringBuilder.AppendLine(x));
StringBuilder sb = e.Last();
Console.WriteLine(sb.ToString());

しかし、それは本当に恐ろしいことです。

于 2009-11-10T14:15:55.330 に答える
4

「Select」の代わりに「ForEach」拡張メソッドを使用します。

stringArray.ToList().ForEach(x => stringBuilder.AppendLine(x));

また

Array.ForEach(stringArray, x => stringBuilder.AppendLine(x));
于 2010-10-21T18:55:26.347 に答える
-1
stringArray.DoForAll(x => StringBuilder.AppendLine(x));

ここで、DoForAllは拡張メソッドです。

public static class CommonExtensions 
{ 
    public static void DoForAll<T>(this IEnumerable<T> items, Action<T> action) where T: class 
    { 
        if (action == null) 
            throw new ArgumentNullException("action"); 
        foreach (var item in items) 
            action(item);   
    }
} 
于 2009-11-10T14:12:48.650 に答える