2012-02-19 21 views
2

ukr:'Ukraine';rus:'Russia';fr:'France'結果を受け取るために文字列を連結する最良の方法は何ですか?文字列を連結する最も効率的な方法は?

public class Country 
{ 
    public int IdCountry { get; set; } 
    public string Code { get; set; } 
    public string Title { get; set; } 
} 

var lst = new List<Country>(); 
lst.Add(new Country(){IdCountry = 1, Code = "ukr", Title = "Ukraine"}); 
lst.Add(new Country() { IdCountry = 2, Code = "rus", Title = "Russia" }); 
lst.Add(new Country() { IdCountry = 3, Code = "fr", Title = "France" }); 
string tst = ???? 
+0

は本当に 'コードターゲットパターンです: 'タイトル';' 'コードが続く: 'タイトル'、'?最初のペアはセミコロンで終わり、2番目のペアはコンマで終わります。これは意図的ですか? – shanabus

+0

の可能な複製[C#を使用した最高の文字列連結方法は何ですか?](http://stackoverflow.com/questions/21078/whats-the-best-string-concatenation-method-using-c) –

+0

shanabus、パターンcorrecred、ありがとう – Yara

答えて

8

私はこのようなものはかなり読みやすいだろうと思う:

string tst = string.Join(";", lst.Select(x=> string.Format("{0}:'{1}'", x.Code, x.Title))); 

string.Join()は結果を組み立てながらので、これは不必要な文字列を作成するべきではありませんボンネットの下StringBuilderを使用しています。

string.Join()へのパラメータは、ちょうどIEnumerable(この過負荷のために必要な.NET 4)であるので、あなたはまた、さらにパフォーマンスに影響を与えることなく、(私の意見では)読みやすさを向上させるために2行にこれを分割することができます:

var countryCodes = lst.Select(x=> string.Format("{0}:'{1}'", x.Code, x.Title)); 
string test = string.Join(";", countryCodes); 
+1

string.Format( "...")をstring.Concat(x.Code、 ": '"、x.Title、 "'")に置き換えることを検討してください。 – Jason

+2

@ Jason - 私は同意しません: 'string.Format'は' StringBuilder'を内部的に使用しているので、 'string.Concat()' **を使ってパフォーマンスの向上が見られず、**読みにくいです。 – BrokenGlass

1

Countryクラス内でToStringメソッドをオーバーライドしてstring.format("{0}:'{1}'", Code, Title)を返し、string.joinを使用してリストメンバーに参加させることができます。

+0

+1:他のシナリオで再利用を促進するための優れたアプローチ。 – Douglas

+0

要素間のセミコロンはどうですか? – Lloyd

+1

これは、BrokenGlassの答えで示されているように、 'string.Join'内に入ります。コードは本当にエレガントになります: 'string.Join("; "、lst)'。 'Join'メソッドは、シーケンス中の各要素に対して' ToString'を呼び出すことを世話します。 – Douglas

0

Enumerable.Aggregateの方法はかなり良いです。 LINQとして

-1
var tst = lst.Aggregate((base, current) => 
        base + ";" + String.Format("{0}:'{1}'", current.Code, current.Title)); 

わずかに効率的な方法は、単純なforeach又はfor(この場合)ループあまり効率的であることがしばしば傾向があります。

すべては、「最も効率的な方法」と言って、の正確な意味でを意味します。

拡張方法:

public static string ContriesToString(this List<Country> list) 
{ 
    var result = new StringBuilder(); 
    for(int i=0; i<list.Count;i++) 
     result.Add(string.Format("{0}:'{1}';", list[i].Code, list[i].Title)); 

    result.ToString(); 
} 

使用:

var lst = new List<Country>(); 
lst.Add(new Country(){IdCountry = 1, Code = "ukr", Title = "Ukraine"}); 
lst.Add(new Country() { IdCountry = 2, Code = "rus", Title = "Russia" }); 
lst.Add(new Country() { IdCountry = 3, Code = "fr", Title = "France" }); 
string tst = lst.ContriesToString(); 
+0

それはukr:Ukrainerus:Russiafr:Franceを実現するだろうか? – Lloyd

+0

@Lloyd:コードはコピーペーストではなく、アイデアの探索のために提供された方法で修正されました。 – Tigran

+0

私は尋ねた理由は私はマークダウンしていない、ちょうどチェックした。 – Lloyd

関連する問題