2011-07-14 24 views
1

もっと機能がよく、簡潔でエレガントな—これを書く方法はありますか?縮小/折りたたみ機能、おそらく?C#/ LINQ:文字列を連結する

var key = String.Join(String.Empty, 
    new[] { 
     keyRoot, 
     controllerName, 
     actionName 
    }.Concat(
     from param in params 
     select param.Key + param.Value 
    ) 
); 

入力が文字列であるいくつかの変数、ならびにDictionary<string, string>から連結されたキー/値の列挙です。

これらのすべての文字列を連結して出力​​する必要があります。

答えて

3

それはあなたがLINQ集計関数を使用することができますように聞こえる:このようなものになるだろう私に

Using LINQ to concatenate strings

+0

だけ明確にする:集計は、実際には、で述べ削減/折り畳みのさまざまな機能であります質問。 –

+0

このアプローチの唯一の問題は、変数 'keyRoot'、' controllerName'、および 'actionName'は辞書と同じ列挙型ではないため、コンカットを使用する必要があるということです。 – FoobarisMaximus

1

より読み:これは、「機能」としてではないかもしれません

string key = string.Format("{0}{1}{2}{3}", 
          keyRoot, 
          controllerName, 
          actionName, 
          string.Join(string.Empty, parameters.Select(p => p.Key + p.Value))); 

が、確かに私が思い付くことができるように簡潔かつ明確です。

0

これはこれは、単一のステートメントである必要はありません場合は、2行短い

var key = string.Concat(
    new[] { 
    keyRoot, 
    controllerName, 
    actionName 
    }.Concat(
     params.Select(kvp) => param.Key + param.Value) 
    ).ToArray() 
); 

...ずっとそれを改善しません。 StringBuilderの拡張子を持つ

var list = new List<String> { 
    keyRoot, 
    controllerName, 
    actionName 
    }; 
list.AddRange (params.Select(kvp) => param.Key + param.Value)); 
var key = string.Concat(list.ToArray()); 
0

public static class StringBuilderExtensions { 

    public static StringBuilder AppendAll(this StringBuilder builder, IEnumerable<string> strings) { 
    foreach (string s in strings) builder.Append(s); 
    return builder; 
    } 

} 

それはかなり短く、効率的に取得します。

string key = 
    new StringBuilder() 
    .Append(keyRoot) 
    .Append(controllerName) 
    .Append(actionName) 
    .AppendAll(parameters.Select(p => p.Key + p.Value)) 
    .ToString(); 

これは、任意の中間の配列を作成せずに文字列を作成します。

改善するべきことの1つは、キーと値をStringBuilderに直接追加することによって断続的な文字列p.Key + p.Valueを回避することですが、コードの再利用が少なくなります。

改善するもう一つのことは、StringBuilderの容量を設定することですが、辞書をループしてuppに最初に文字列の長さを追加する必要があります。

(注:それがキーワードであると私は、代わりにparamsの辞書の名前をparametersを使用していました。)

0

私はすべての文字列のシーケンスを連結するために、あなたの構築物はすでにすることができますようになどの機能だと思います取得する。代わりに空の文字列でString.Joinを使用しての

、私はおそらく私も

var seq = new[] { 
        keyRoot, 
        controllerName, 
        actionName 
      }.Concat(
      from param in params select param.Key + param.Value 
     ); 
var sb = new StringBuilder(); 
seq.ForEach(s=>sb.Append(s)); 
様配列のローカル変数を定義し

public static class MyExtensions { 
    public static void ForEach(this IEnumerable<T> enumerable, Action<T> action) { 
    foreach (var entry in enumerable) 
     action(entry); 
    } 
} 

ようForEach extenstion方法と一緒にStringBuilderを使用したいです

もちろん、Aggregate機能を使用する方がより機能的ですが、私の意見では読みにくく、パフォーマンスの低下もあります。中間体を構築する必要があるためです文字列...ここ

0

Aggregateを使用して1式の中溶液(事実上倍)である:

var key = params.Aggregate(new StringBuilder() 
    .Append(keyRoot) 
    .Append(controllerName) 
    .Append(actionName), 
    (sb, p) => sb.Append(p.Key).Append(p.Value)) 
    .ToString();