2016-11-24 88 views
1

搜索完電路板後,我無法找到解決問題的方案。將泛型集合轉換爲字符串列表

我寫了下面的代碼工作得很好:

public static void CreateFile(this List<string> lines,File_attribute fa) 
{ 
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(fa.OutpoutFolder+ fa.FileName)) 
    { 
     foreach (string line in lines) 
     { 

      file.WriteLine(line); 

     } 
    } 
} 

現在,我希望能夠完成這一點與對象的泛型集合。我希望每個屬性只是「ToStringed」。這裏是我的代碼的開始:

public static void CreateFile<T>(this List<T> lines, File_attribute fa) 
{ 
    List<string> mylist = new List<string>(); 
    ............... 
    ............... 

任何幫助將不勝感激。

+0

您可以定義T是類型對象,只需添加T:object對象。對象有ToString – anhoppe

+0

@anhoppe結構也可以'ToString''d –

+1

@anhoppe'T'已經是對象... –

回答

1

下面是使用string.Join一個可能的替代方法:

public static void CreateFile<T>(this List<T> lines, File_attribute fa) 
{ 
    File.WriteAllText 
    (
      Path.Combine(fa.OutpoutFolder, fa.FileName), 
      string.Join(Environment.NewLine, lines) 
    ); 
} 

所以string.Join將在內部調用Object.ToString()

+0

將所有內容組合成單個字符串可能不是最好的方法,具體取決於傳入的集合的大小。也許OP使用的是具有集合上迭代的流的原因,然後可能不會... – Igor

+0

@Igor我已經提出了同樣的擔憂,作爲你自己的回答中的評論...想象一下,OP有一個100k項目的「列表」......這不是一個壞習慣*本身*? –

+0

@Igor **程序員浪費大量時間思考或擔心程序中非關鍵部分的速度,這些效率嘗試實際上在考慮調試和維護時會產生強烈的負面影響。我們應該忘記小效率,大約97%的時間:不成熟的優化是所有邪惡的根源** http://wiki.c2.com/?PrematureOptimization –

2

您可以使用LINQ這個

public static void CreateFile<T>(this List<T> lines, File_attribute fa) 
{ 
    List<string> mylist = lines.Select(x => x.ToString()).ToList(); 
    ............... 
    ............... 
0
public static void CreateFile<T>(this List<T> lines) 
{ 
    List<string> mylist = new List<string>(); 
    var props = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); 
    foreach (var item in lines) 
    { 
     foreach (var prop in props) 
     { 
      var val = prop.GetValue(item); 
      // do what you want with val, you can call ToString() on it 
     } 
    } 
} 
+0

你確定你的回答很好? :( –

+1

@MatíasFidemraizernope,但OP詢問ToStringing「每個屬性」,所以也許他想這樣做 –

+0

呃我相信OP想說**項目**而不是*屬性* –

1

只需使用ToString對於每一個項目,其餘的可以保持不變:

public static void CreateFile<T>(this List<T> items, File_attribute fa) 
{ 
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(fa.OutpoutFolder + fa.FileName)) 
    { 
     foreach (T item in items) 
      file.WriteLine(item.ToString()); 
    } 
} 

通過做這種方式,一個巨大的名單,這將阻止應用程序之前,分配大量內存它可以寫入任何東西到磁盤。

0

雖然一切從System.Object派生,併爲此實現.ToString()這是很容易忽視這個作爲主叫,並用它在類型,其中你沒有覆蓋.ToString()然後將輸出的對象類型,而不是一個預期的一些消息。爲了更好地控制,我會強烈推薦一個接口,然後將其用作您的方法的通用約束。

public interface ILine { 
    string GetLineOutput(); 
} 

然後在你的課堂上。

public static void CreateFile(this List<T> lines, File_attribute fa) where T : ILine 
{ 
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(System.IO.Path.Combine(fa.OutpoutFolder, fa.FileName))) 
    { 
     foreach (ILine line in lines) 
     { 
      file.WriteLine(lin.GetLineOutput()); 
     } 
    } 
} 

一些旁註

  1. 當創建具有可變的部分,你應該使用System.IO.Path.Combine這些部件組合文件路徑。
  2. 使用流並寫入它一行一行,而不是一次全部寫入,哪一個可能導致內存問題。也很好的使用using爲您的流!
+0

這不是過度使用嗎?工程? –

+0

@MatíasFidemraizer - 不是IMO。如果你要從不同的位置調用這個函數,並且永遠不會覆蓋傳入類型的'ToString()',那麼最終的輸出結果只會包含意外的限定類型名稱,絕對不會引發任何異常,唯一的辦法就是當你(某些人)真正看到輸出時 – Igor

+0

現在我會爲你提出一個很好的問題:你如何在第三方實現ILine?圖書館?:D –