2010-11-16 42 views
3

我有以下代码可以返回我想要遍历的泛型列表,并因此生成逗号分隔值列表作为字符串。如何从通用列表中创建一个CSV字符串<T>

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; 
    } 
} 

我可以使用每个循环来做到这一点?

+0

希望没有人心中的标题变化......多一点表示实际问题。 – Josh 2010-11-16 17:28:09

+0

大声笑......需要有一个墨西哥对峙标签;) – Josh 2010-11-16 17:29:28

回答

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

请注意,如果该字段包含',',那将无法工作。 – 2011-04-22 20:22:44

3

如果你已经有名单,那么你可以只使用String.Join方法:

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

瞧!

+0

哎呀!意识到我有我的参数落后...现在修复 – Josh 2010-11-16 17:23:08

4

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

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

你做什么,将取决于哪一个版本的C#和.NET您正在使用的具体细节,但上述只是一个例子。如果你能给我们更多的细节,我们可以给你更具体的代码。

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

+0

我使用.net 4.0,但它不喜欢我尝试加入一个GENERIC列表,想法? – kacalapy 2010-11-16 17:49:05

+0

使用:var csv = String.Join(“,”,GetCurrentSelection(criteriaType).ToArray());我告诉我有无效的论点......? – kacalapy 2010-11-16 17:50:55

+0

@kalapy:如果你真的在使用。 Net 4那么即使没有对ToArray的调用也应该没问题 - 但是请注意它会在每个值上调用ToStrung。那是你要的吗?如果没有,按照我的答案使用投影。 – 2010-11-16 18:15:19

2

如果您安装了.NET 4,你可以使用String.Join<T>(string, IEnumerable<T>)

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

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

+0

我喜欢这个string.join方法!!!我正在使用.net 4。0 – kacalapy 2010-11-16 17:46:25

+0

我有一个问题:var csv = String.Join(“,”,GetCurrentSelection(criteriaType));不喜欢,我想加入一个GENERIC列表不是数组。 – kacalapy 2010-11-16 17:47:26

+0

@ kacalapy:这很奇怪;它应该在4.0。我现在无法测试它,不幸的是,因为我没有Visual Studio可用... – Heinzi 2010-11-16 18:28:36

1

我喜欢加入一个在线解决方案,但由于野兽的本质,和野兽是我的目标,我必须环路和拉各普通物品的价值...

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

删除最后一个','的简单方法。总是让我烦恼,如果在循环中。 – argatxa 2011-03-28 11:23:49

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); 
相关问题