-1

簡単な質問:

コレクションを反復処理して文字列ビルダーを使用してJSON文字列を作成しています(そうです、これを行うにはおそらくもっと賢い方法がありますが、linqをデバッグすると頭痛の種になります)。配列を作成するときは、各項目の後にコンマを付ける必要があります。

現在、foreachで各行が処理される前にintをインクリメントすることでこれを行っています。また、intがコレクション内の行数と一致する場合は、コンマを追加しません。

StringBuilder bob = new StringBuilder();
int i = 0;
foreach(Item m in Rows){
     i++;
     bob.Append(string.Format("{{ foo: '{0}', bar: '{1}' }}", m.foo, m.bar));
     bob.Append(i == Rows.Count() ? "" : ",")
}

現在のオブジェクトがコレクションの最後であるかどうかを判断するためのよりスマートな方法があるかどうか疑問に思っていますか?

アップデート:

答えた。良い答えがたくさんあったので、1つしか選べないのは本当に残念です。特に、マシュー・ワトソンの答えは、おそらく私が最初に探していたものに最も近いものでした。これが最後のアイテムであるかどうかをコレクションに直接尋ねる方法です。ただし、他のすべての回答を確認した結果、String.Joinの方が優れていると判断し、foreachをLinqに置き換える方が再び優れていると判断しました。みなさん、ありがとうございました!

4

5 に答える 5

3

これに使用できますstring.Join

渡された区切り文字を使用して、渡された文字列の配列を連結し、最後の値では省略します。

何かのようなもの:

var vals = string.Join(",", Rows.Select(
                              i => string.Format(
                                      "{{ foo: '{0}', bar: '{1}' }}", 
                                      i.foo, 
                                      i.bar)));
于 2013-03-11T11:19:16.970 に答える
2

StringBuilderカンマを連結するためにを使用してみませんか?編集:コードを追加したので、すでにを使用していることがわかります。StringBuilderこれは機能します。

StringBuilder bob = new StringBuilder();
foreach(Item m in Rows)
{
     bob.Append(string.Format("{{ foo: '{0}', bar: '{1}' }}", m.foo, m.bar));
}
if(bob.Length != 0) bob.Length -= 1;

別の方法は使用していString.Joinます:

string csv = string.Join(",", array);
于 2013-03-11T11:18:22.657 に答える
0

私は通常最初の項目を追跡し、ループの先頭にコンマを含めます。

bool first = true;
foreach (var item in items)
{
    if (first)
    {
        sb.Append(',');
        first = false;
    }

    sb.Append(item);
}

上記は次のように変換できることに注意してください。

sb.Append(string.Join(",", items));

編集コードを追加したので、ループを1つのステートメントに変更できます。

String bob = string.Join(",", Rows.Select(r => string.Format("{{ foo: '{0}', bar: '{1}' }}", r.foo, r.bar)));

JSONを書き出そうとしているようです。おそらく一見の価値があるこのためのライブラリがあります。

于 2013-03-11T11:18:19.733 に答える
0

1行に1つのアイテムがあると仮定すると、次のことができます。

jsonString.ReplaceAll("\n",",");
于 2013-03-11T11:23:10.677 に答える
0

すでにたくさんの良い答えがありますが、私はこれと多くの関連する問題に役立つ有用な汎用クラスに言及したかっただけです。

Jon SkeetのSmartEnumerableクラスを使用すると、列挙子に問い合わせて、そのインデックスと、それが列挙の最初または最後の項目であるかどうかを確認できます。(これが実装です。)

SmartEnumberableを使用すると、コードは次のようになります。

var result = new StringBuilder();

foreach (var item in data.AsSmartEnumerable())
{
    result.Append(item.Value);

    if (!item.IsLast)
    {
        result.Append(", ");
    }
}

または:

foreach (var item in data.AsSmartEnumerable())
{
    if (!item.IsFirst)
    {
        result.Append(", ");
    }

    result.Append(item.Value);
}
于 2013-03-11T11:28:24.027 に答える