2017-07-12 3 views
0

私はLinq Aggregate Queryを使用して、リスト<string>の一部のデータと共に行シーケンス番号を印刷する方法?

List<string> Test=new List<string>() {"A","B","C"} 

のような単純なリストを持って、私は下のように、このリストの要素から文字列を取得するには下のような単純なLinq.Aggregateを使用しています: -

string Output= Test.Aggregate((First, Next) => First + "\r\n" + Next); 

これは私に与えます

- :

A 
B 
C 

は、しかし、私はすなわち、このように、各ラインのシーケンス番号となりたい:(改行区切り)のようになります

1)A 
2)B 
3)C 

linqを使用してこれを行うにはどうすればよいですか?

答えて

1

Selectはあなたを与える過負荷を持っていますあなたが行うことができるようにする要素のインデックスSelect((x,i)=>String.Format("{0}){1}", i+1,x))。または全額:ものの言及する価値

string output= Test.Select((x,i)=>String.Format("{0}){1}", i+1,x)).Aggregate((First, Next) => First + "\r\n" + Next); 

ことの一つは、ループ内でその文字列の連結は、(とAggregate数のループのように)一般的にパフォーマンス上の理由から悪いアイデアと見なされています。あなたは、このようなStringBuilderのような代替方法を使用して検討する必要があります。

string output = Test 
    .Aggregate (new StringBuilder(), (sb, x) => sb.AppendFormat("{0}){1}\r\n", lineCount++, x)) 
    .ToString(); 
+0

txクリス。これは私が探しているものです... –

1

私は、たとえば、インデックスを取得し、単一の文字列を作るために一緒に戻って結果のリストに参加するために、ここだけSelectAggregateを使用することはありません。

var output = string.Join("\r\n", 
    Test.Select((s, index) => $"{index+1}){s}")); 
+0

その2つの複数回を連結した文字列の束を作るには適用されない繰り返し文字列連結の古い格言が悪いと。つまり、 "{index + 1} {{}}"がおそらく内部的に文字列を連結しているということを心配する必要があります。これを複数回行っているか、複数の連結によって1つの大きな文字列を作成している心配する必要がありますか?私はそれを心配することを避けるために集計にstringbuilderのために行ったが、もしそれが残忍であったかどうかは分からなかった。 – Chris

+1

@Chris StringBuilderは良い可能性がある。 '$" ... "'メソッドは 'string.Format'のまわりに包まれた構文的な砂糖ですので、そこには連結がありません。 – DavidG

関連する問題