2017-06-06 71 views
0

我嘗試轉換列表以CSV string.list有200+ properties.So我需要的性能以及
編號,姓名,班級,姓....等值 例..
1,測試,第二測試....等..
2,TEST2,第二,... TEST2等等...轉換列表到csv字符串

我以前用foreach追加

foreach (var value in testData) 
     { 
      sb.Append(separator).Append(value); 
      separator = ","; 
       sb.Append(separator).Append(value); 
      separator = ","; 
     } 

我需要通過200個屬性,它增加了代碼行。

+0

在一個對象中有200個屬性...?二百?笏?不知怎的,我得到了你沒有正確解釋你的情況的感覺...... – elgonzo

+0

可能他想要一個片段來讀取屬性和值,而不需要編寫增加他的代碼的屬性名稱。這是我的猜測...所以,我們需要源對象,類型和結構。 –

+0

@AndrewPaes,我幾乎建議在評論中使用反射。但是,在我看來,200多個房產看起來有點太古怪,不值得面子。正如你所說,有可能涉及其他類型/結構/數據集,而不僅僅是屬性... – elgonzo

回答

0

這是我已經實現的東西,需要一個對象並讀取屬性值,然後將其格式化爲csv'd字符串。

Write.WriteObject()是您如何使用它的一個例子。

public static class StringExtensions 
{ 
    public static string ToCSV(this object field, bool first) 
    { 
     if(field != null) 
     { 
      string retVal = field.ToString(); 
      retVal = retVal.Contains(",") || retVal.Contains("\"") || retVal.Contains("\r\n") 
       ? "\"" + retVal + "\"" : retVal; 
      retVal = first ? retVal : "," + retVal; 
      return retVal; 
     } 
     else 
     { 
      return first ? "" : ","; 
     } 
    } 
} 

public class Format 
{ 
    public string CommaSeparatedObject(Type layoutType, object value, bool header) 
    { 
     bool first = true; 

     string retVal = ""; 
     PropertyInfo[] props = layoutType.GetProperties(); 

     if (header) 
     { 
      foreach (PropertyInfo prop in props) 
      { 
       retVal += prop.Name.ToCSV(first); 
       first = false; 
      } 
     } 
     else 
     { 
      foreach (PropertyInfo prop in props) 
      { 
       retVal += prop.GetValue(value).ToCSV(first); 
       first = false; 
      } 
     } 


     return retVal; 
    } 
} 

public class Write 
{ 
    public void WriteObject(IEnumerable<myClass> myObj) 
    { 
     StreamWriter sw = new StreamWriter(parameters.OutputFile, true, Encoding.ASCII, 16 * 1024); 

     sw.WriteLine(new Format().CommaSeparatedObject(typeof(myClass), item, true))); //write header 

     foreach(var item in myObj) 
     { 
      sw.WriteLine(new Format().CommaSeparatedObject(typeof(myClass), item, false))); 
     } 
    } 
}