如何从通用列表<t> </t>创建CSV字符串

时间:2010-11-16 17:17:40

标签: c# generics

我有以下代码返回我想要迭代的泛型列表,因此生成一个以逗号分隔的值列表作为字符串。

public static List<ReportCriteriaItem> GetCurrentSelection(ReportWizardCriteriaType criteriaType)
    {
        return Criteria.CriteriaList.FindAll(delegate(ReportCriteriaItem item) 
                                                { return item.CriteriaType == criteriaType; }
                                            );
    }

这里是ReportCriteriaItem的定义 - 我创建了一个通用列表的对象...我认为这是关键,将其“id”字段变为CSV:

public class ReportCriteriaItem
{
    [System.Xml.Serialization.XmlAttribute("id")]
    public string Id { get; set; }

    [System.Xml.Serialization.XmlAttribute("name")]
    public string Name { get; set; }

    [System.Xml.Serialization.XmlAttribute("value")]
    public string Value { get; set; }

    [System.Xml.Serialization.XmlAttribute("type")]
    public ReportWizardCriteriaType CriteriaType { get; set; }

    public ReportCriteriaItem() { }
    public ReportCriteriaItem(ReportWizardCriteriaType criteriaType, string id, string name, string value)
    {
        this.Id = id;
        this.Name = name;
        this.Value = value;
        this.CriteriaType = criteriaType;
    }
}

我可以为每个循环使用a来执行此操作吗?

6 个答案:

答案 0 :(得分:4)

最简单的方法是使用string.Join

string joined = string.Join(",", GetCurrentSelection(...).Select(x => x.Value));

您所做的具体细节将取决于您使用的C#和.NET版本,但以上只是一个示例。如果您可以提供更多详细信息,我们可以为您提供更具体的代码。

(特别是在.NET 3.5中,您需要为string.Join提供一个数组;在.NET 4中您不需要。您正在使用的.NET版本更为重要而不是你使用ASP.NET的事实。)

答案 1 :(得分:3)

如果您已有列表,则可以使用String.Join方法:

var myList = GetCurrentSelection(ReportWizardCriteriaType.SomeCriteria);
var csv = String.Join(",",myList.ToArray());

瞧!

答案 2 :(得分:2)

如果您有.net 4,则可以使用String.Join<T>(string, IEnumerable<T>)

string csv = string.Join(", ", GetCurrentSelection(...));

通过对ReportCriteriaItem执行ToString(),从{{1}}生成字符串项。如果必须通过访问ReportCriteriaItem的其他方法或属性(或者如果您使用的.net版本小于4)生成字符串值,则Jon Skeet's answer是可行的方法。

答案 3 :(得分:1)

string list = "";
foreach (ReportCriteriaItem item in GetCurrentSelection(...)) {
    if (!string.IsNullOrEmpty(list)) list += ",";
    list += item.???;
}
// do something with the list.

答案 4 :(得分:1)

我喜欢加入一行解决方案,但由于野兽的性质,而野兽是我的对象,我必须循环并拉出每个通用项目的价值......

string csv = "";
            foreach (ReportCriteriaItem item in GetCurrentSelection(criteriaType))
            {
                csv += item.Id + ",";
            }
            return csv.TrimEnd(",".ToArray() ) ;

答案 5 :(得分:0)

享受!

public static class DataHelper
{
   public static string ToCsv<T>(string separator, IEnumerable<T> objectlist)
   {
                Type t = typeof(T);
                PropertyInfo[] fields = t.GetProperties();

                string header = String.Join(separator, fields.Select(f => f.Name).ToArray());

                StringBuilder csvdata = new StringBuilder();
                csvdata.AppendLine(header);

                foreach (var o in objectlist)
                    csvdata.AppendLine(ToCsvFields(separator, fields, o));

                return csvdata.ToString();
            }

public static string ToCsvFields(string separator, PropertyInfo[] fields, object o)
            {
                StringBuilder linie = new StringBuilder();

                foreach (var f in fields)
                {
                    if (linie.Length > 0)
                        linie.Append(separator);

                    var x = f.GetValue(o);

                    if (x != null)
                        linie.Append(x.ToString());
                }

                return linie.ToString();
            }
    }

像这样使用

var customers = new List<Customer>(); // Any simple class
string csv = DataHelper.ToCsv(";",customers );