如何将 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.Join
将 IEnumerable<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= 结尾的属性]...
我无法获取循环中的最后一项写入 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.Join
将 IEnumerable<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= 结尾的属性]...