将泛型集合转换为字符串列表

时间:2016-11-24 09:56:54

标签: c# .net generics

在搜索电路板后,我无法找到解决问题的方法。

我写了以下代码,效果很好:

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>();
    ...............
    ...............

任何帮助都将受到高度赞赏。

5 个答案:

答案 0 :(得分:2)

您可以将LINQ用于此

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

答案 1 :(得分: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()

答案 2 :(得分: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());
    }
}

通过这种方式,对于一个庞大的列表,这将阻止您的应用程序在将任何内容写入磁盘之前分配大量内存。

答案 3 :(得分: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
        }
    }
}

答案 4 :(得分: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());
        }
     }
}

然后在你的班上。

System.IO.Path.Combine

一些附注

  1. 创建包含可变部分的文件路径时,应使用using组合这些部分。
  2. 使用流并且逐行写入而不是一次性写入可能导致内存问题。使用dydx = tf.gradients([output_scalars[i] for i in range(0, NUM_CLASSES)], [input_cnn])[0]) 为您的流做好!