2016-11-24 50 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 –