我有一个整数值列表(List),并希望生成一个逗号分隔值的字符串.这是列表输出中的所有项目到单个逗号分隔列表.
我的想法...... 1.将列表传递给方法.2.使用stringbuilder迭代列表并附加逗号3.测试最后一个字符,如果是逗号,则删除它.
你的想法是什么?这是最好的方法吗?
如果我不仅要处理整数(我当前的计划),还要处理字符串,longs,double,bools等等,我的代码将如何变化?我想让它接受任何类型的列表.
框架已经为我们做了很多事情.
ListmyValues; string csv = String.Join(",", myValues.Select(x => x.ToString()).ToArray());
对于一般情况:
IEnumerablemyList; string csv = String.Join(",", myList.Select(x => x.ToString()).ToArray());
正如你所看到的,它实际上并没有什么不同.请注意,如果包含逗号,您可能需要实际包装x.ToString()
引号(即"\"" + x.ToString() + "\""
)x.ToString()
.
有关这方面略有变化的有趣读物:请参阅Eric Lippert博客上的Comma Quibbling.
注意:这是在.NET 4.0正式发布之前编写的.现在我们可以说
IEnumerablesequence; string csv = String.Join(",", sequence);
使用过载String.Join
.此方法将自动将每个元素投影x
到x.ToString()
.
在3.5,我仍然能够做到这一点.它更简单,不需要lambda.
String.Join(",", myList.ToArray());
您可以创建一个可以在任何IEnumerable上调用的扩展方法:
public static string JoinStrings( this IEnumerable values, string separator) { var stringValues = values.Select(item => (item == null ? string.Empty : item.ToString())); return string.Join(separator, stringValues.ToArray()); }
然后你可以在原始列表上调用该方法:
string commaSeparated = myList.JoinStrings(", ");
你可以用String.Join
.
String.Join( ",", Array.ConvertAll( list.ToArray(), element => element.ToString() ) );
如果任何正文要转换自定义类对象列表而不是字符串列表,则使用类的csv行表示覆盖类的ToString方法.
Public Class MyClass{ public int Id{get;set;} public String PropertyA{get;set;} public override string ToString() { return this.Id+ "," + this.PropertyA; } }
然后,可以使用以下代码将此类列表转换为带有标题列的 CSV
string csvHeaderRow = String.Join(",", typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(x => x.Name).ToArray()) + Environment.NewLine; string csv= csvHeaderRow + String.Join(Environment.NewLine, MyClass.Select(x => x.ToString()).ToArray());
正如@Frank给出的链接中的代码从.NET通用列表创建一个CSV文件时,有一个小问题是,
我修改了代码来结束每一行以摆脱它.希望它可以帮助某人.
////// Creates the CSV from a generic list. /// ; ///; /// The list.; /// Name of CSV (w/ path) w/ file ext.; public static void CreateCSVFromGenericList (List list, string csvCompletePath) { if (list == null || list.Count == 0) return; //get type from 0th member Type t = list[0].GetType(); string newLine = Environment.NewLine; if (!Directory.Exists(Path.GetDirectoryName(csvCompletePath))) Directory.CreateDirectory(Path.GetDirectoryName(csvCompletePath)); if (!File.Exists(csvCompletePath)) File.Create(csvCompletePath); using (var sw = new StreamWriter(csvCompletePath)) { //make a new instance of the class name we figured out to get its props object o = Activator.CreateInstance(t); //gets all properties PropertyInfo[] props = o.GetType().GetProperties(); //foreach of the properties in class above, write out properties //this is the header row sw.Write(string.Join(",", props.Select(d => d.Name).ToArray()) + newLine); //this acts as datarow foreach (T item in list) { //this acts as datacolumn var row = string.Join(",", props.Select(d => item.GetType() .GetProperty(d.Name) .GetValue(item, null) .ToString()) .ToArray()); sw.Write(row + newLine); } } }