快速提问:
我正在通过迭代集合并使用字符串构建器来构建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() ? "" : ",")
}
我想知道是否有更智能的方法来确定当前对象是否是集合中的最后一个?
更新
回答。真的很遗憾我只能选一个,因为有很多好的答案。特别是Matthew Watson的答案可能与我最初寻找的答案最接近 - 直接询问集合是否这是最后一项。但是,在回顾所有其他答案时,我认为String.Join只是更好,用Linq取代foreach再好一点。感谢大家的帮助!
答案 0 :(得分:3)
您可以使用string.Join
。
它使用传入的分隔符连接传入的字符串数组,省略最后一个值。
类似的东西:
var vals = string.Join(",", Rows.Select(
i => string.Format(
"{{ foo: '{0}', bar: '{1}' }}",
i.foo,
i.bar)));
答案 1 :(得分: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);
答案 2 :(得分:0)
我通常会跟踪第一项,并在循环开头包含逗号。
bool first = true;
foreach (var item in items)
{
if (first)
{
sb.Append(',');
first = false;
}
sb.Append(item);
}
请注意,以上内容可以转换为:
sb.Append(string.Join(",", items));
编辑由于您添加了代码,因此您可以将循环更改为单个语句:
String bob = string.Join(",", Rows.Select(r => string.Format("{{ foo: '{0}', bar: '{1}' }}", r.foo, r.bar)));
看起来你正试图写出JSON。有些库可能值得一看。
答案 3 :(得分:0)
假设每行可以有一个项目
jsonString.ReplaceAll("\n",",");
答案 4 :(得分:0)
已经有很多好的答案,但我只想提一个有用的通用课程来帮助解决这个问题以及许多相关的问题。
Jon Skeet's SmartEnumerable class允许您查询枚举器以查找其索引以及它是枚举中的第一个还是最后一个项目。 (Here's an implementation。)
使用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);
}