-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() ? "" : ",")
}

我想知道是否有一些更聪明的方法来确定当前对象是否是集合中的最后一个?

更新:

回答。我只能选择一个真的很遗憾,因为有很多好的答案。特别是 Matthew Watson 的回答可能与我最初寻找的最接近 - 一种直接询问集合是否是最后一项的方法。但是,在查看所有其他答案时,我认为 String.Join 更好,用 Linq 替换 foreach 再次更好。感谢大家的帮助!

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

为什么不使用 aStringBuilder连接逗号?编辑:由于您现在添加了代码,我看到您已经在使用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

已经有很多好的答案了,但我只想提一个有用的通用类,它可以帮助解决这个问题和许多相关问题。

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 回答
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。有一些图书馆可能值得一看。

于 2013-03-11T11:18:19.733 回答
0

假设每行有一个项目你可以做

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