0

私は過去にこれを使用して、コンマ区切りのリストを作成しました。

var list = new List<int>{1,2,3};
var retVal = list.Select(i=>i.ToString()).Aggregate((a,b) => a+", "+b);

よく働く。

各要素をxmlノードとして「ラップ」するのと同じようなことをしようとしています。

何かのようなもの:

Aggregate((a, b) => string.Format("<ID>{0}</ID><ID>{1}</ID>", a,b))

しかし、それをうまく機能させることはできないようです。出来ますか?それとも完全に簡単な方法はありますか?

ありがとう。

4

4 に答える 4

3

ブリンディの答えは確かに機能しますが、私は個人的に使用します:

var list = new List<int> {1, 2, 3};
var joined = string.Join("", list.Select(x => "<ID>" + x + "</ID>")
                                 .ToArray());

個人的には、集計よりも読みやすく、理解しやすいと思います。私はそれもより効率的だと信じています-それは大きなリストにのみ問題になるでしょうが。

于 2009-11-01T21:14:27.160 に答える
3

それとも完全に簡単な方法はありますか?

List<int> list = new List<int>{1, 2, 3};
var xmlNodes = list.Select(i => new XElement("ID", i));
XElement xml = new XElement("Data", xmlNodes);
Console.WriteLine(xml);
于 2009-11-02T13:02:10.990 に答える
2

次のようにすべきではありません:

Aggregate((a, b) => string.Format("{0}<ID>{1}</ID>", a,b))

a新しいノードに追加しています。

于 2009-11-01T21:12:28.300 に答える
0

これを実現する方法はいくつかありますが、正解は「状況によって異なります」と思われます。CSV文字列を作成する元の例では、文字列連結演算子を使用しています。推奨されるアプローチは、この目的でStringBuilderクラスを使用することです。また、.Net 4.0には、string.Join()メソッドの新しいオーバーロードがあり、使用と理解が非常に簡単です。

// .Net 3.5
var list = new List<int>{1,2,3};
var csv = list.Aggregate(new StringBuilder(), 
    (sb, i) => sb.Append(i).Append(','),
    sb => { if (sb.Length > 0) sb.Length--; return sb.ToString(); });

// .Net 4.0
var csv1 = string.Join(",", list);

文字列ではなくXMLドキュメントを作成することを意図している場合は、上記のDavidBの回答が適切なオプションです。

var xml = new XElement("Root", list.Select(i => new XElement("ID", i)));
// <Root>
//   <ID>1</ID>
//   <ID>2</ID>
//   <ID>3</ID>
// </Root> 

XML文字列を作成するために、開始タグと終了タグを明示的にコーディングすることは避けたいと思います。あなたの例では、開始タグまたは終了タグのいずれかで要素名「ID」を正しく取得することは困難ですが、これはDRYの原則の観点から考えています。構成ファイルなどで開始タグを変更したときに、要素の終了タグを変更するのを忘れることがあります。XElementを使用すると、この問題を完全に回避できます。

// .Net 3.5
var xml1 = list.Aggregate(new StringBuilder(), 
           (sb, i) => sb.Append(new XElement("ID", i)),
           sb => sb.ToString());

// .Net 4.0
var xml2 = string.Join("", list.Select (i => new XElement("ID", i)));
// both xml1 & xml2 contain "<ID>1</ID><ID>2</ID><ID>3</ID>"

Aggregate()string.Join()string.Join( )のパフォーマンスは、毎回勝ちます(私が使用したかなり限定された/基本的なテストケースで)。

于 2010-07-09T05:06:01.033 に答える