如何将 foreach 循环中的最后一项写入 CSV?

How to get the last item in foreach loop writing to CSV?

我无法获取循环中的最后一项写入 CSV,我不希望 CSV 中的最后一项在末尾有一个 ,

这是将我的控制器写入 CSV 的 public 字符串

    public string WriteTsv<T>(IEnumerable<T> data)
    {
        StringBuilder output = new StringBuilder();
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
        foreach (PropertyDescriptor prop in props)
        {
            output.Append(prop.DisplayName); // header
            output.Append(", \t");
        }
        output.AppendLine();
        foreach (T item in data) 
        {
            foreach (PropertyDescriptor prop in props)
            {
                output.Append(prop.Converter.ConvertToString(
                     prop.GetValue(item)));
                output.Append(", \t");
            }
            output.AppendLine();
        }
        return output.ToString();
    }

我已经坚持了一段时间,希望有人能提供帮助。

您可以使用 String.JoinIEnumerable<T> 与分隔符组合起来,然后使用 AppendLine 添加到 output。我使用 Cast<T>()IEnumerable 实现从遗留 PropertyDescriptorCollection 转换为现代 IEnumerable<T>。 (不幸的是,许多 C# 尚未更新以正确支持 IEnumerable<T>。)

public string WriteTsv<T>(IEnumerable<T> data) {
    var output = new StringBuilder();
    var props = TypeDescriptor.GetProperties(typeof(T)).Cast<PropertyDescriptor>();
    // header
    output.AppendLine(String.Join(",", props.Select(prop => prop.DisplayName)));
    // data
    foreach (T item in data)
        output.AppendLine(String.Join(",", props.Select(prop => prop.Converter.ConvertToString(prop.GetValue(item)))));
    return output.ToString();
}

根据您的代码,最简单的方法是在每次调用 AppendLine() 之前删除最后 3 个字符(最后的 ", \t"),因为 StringBuilder.Length 属性 是可写的。

所以,不只是

output.AppendLine();

output.Length -=3;
output.AppendLine();

来自同一文档,它说,

If the specified length is less than the current length, the current StringBuilder object is truncated to the specified length.

如果您认为可能存在长度小于 3 的字符串,您当然需要进行一些错误检查。您可能还需要注意字符串值实际上以 [=14= 结尾的属性]...