关于数组:在c#中确定集合中的最后一行

Determining the last row in a collection in c#

快速提问:

我正在通过迭代一个集合并使用字符串生成器来构建一个JSON字符串(是的,可能有更聪明的方法可以做到这一点,但是调试LINQ让我头疼)。当我构建一个数组时,我必须在每一项后面加一个逗号。

目前,我通过在foreach中处理每一行之前增加一个in t来实现这一点,如果int与集合中的行数匹配,我不会添加逗号。

1
2
3
4
5
6
7
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() ?"" :",")
}

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

更新:

回答。真可惜我只能选一个,因为有很多好答案。特别是马修·沃森的回答可能是最接近我最初寻找的答案——一种直接问收藏是否是最后一个项目的方法。然而,在回顾所有其他答案时,我已经确定了string.join更好,用linq替换foreach更好。谢谢大家的帮助!


你可以用String.Join来做这个。

它使用传入分隔符连接传入的字符串数组,并省略最后一个值。

类似:

1
2
3
4
5
var vals = string.Join(",", Rows.Select(
                              i => string.Format(
                                     "{{ foo: '{0}', bar: '{1}' }}",
                                      i.foo,
                                      i.bar)));


为什么不使用StringBuilder连接逗号?编辑:既然您现在已经添加了代码,我发现您已经在使用StringBuilder,所以这是有效的:

1
2
3
4
5
6
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

1
string csv = string.Join(",", array);


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

JonSkeet的SmartEnumerable类允许您询问枚举器以查找其索引,以及它是枚举中的第一项还是最后一项。(这是一个实现。)

使用智能数字,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
var result = new StringBuilder();

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

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

或:

1
2
3
4
5
6
7
8
9
foreach (var item in data.AsSmartEnumerable())
{
    if (!item.IsFirst)
    {
        result.Append(",");
    }

    result.Append(item.Value);
}

假设每行只有一个项目,您可以这样做

1
2
jsonString.ReplaceAll("
"
,",");


我通常跟踪第一个项目,并在循环的开头包含逗号。

1
2
3
4
5
6
7
8
9
10
11
bool first = true;
foreach (var item in items)
{
    if (first)
    {
        sb.Append(',');
        first = false;
    }

    sb.Append(item);
}

请注意,上述内容可以转换为:

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

编辑自添加代码以来,可以将循环更改为单个语句:

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

看起来你在写JSON。有一些图书馆可能值得一看。