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

C# 将泛型集合转换为字符串列表,c#,.net,generics,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 (str

在搜索董事会之后,我无法找到解决问题的方法

我编写了以下代码,效果非常好:

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

         }
     }
}
publicstaticvoidcreatefile(此列表行,文件属性fa)
{
使用(System.IO.StreamWriter file=new System.IO.StreamWriter(fa.output文件夹+fa.FileName))
{
foreach(行中的字符串行)
{
文件写入线(第行);
}
}
}
现在,我想通过一个对象的通用集合来实现这一点。我希望每个属性都是“ToString”。以下是我的代码的开头:

public static void CreateFile<T>(this List<T> lines, File_attribute fa)
{
    List<string> mylist = new List<string>();
    ...............
    ...............
publicstaticvoidcreatefile(此列表行,文件属性fa)
{
List mylist=新列表();
...............
...............

我们将非常感谢您的帮助。

您可以使用LINQ进行此操作

public static void CreateFile<T>(this List<T> lines, File_attribute fa)
{
    List<string> mylist = lines.Select(x => x.ToString()).ToList();
    ...............
    ...............
publicstaticvoidcreatefile(此列表行,文件属性fa)
{
列出mylist=行。选择(x=>x.ToString()).ToList();
...............
...............

您可以使用LINQ进行此操作

public static void CreateFile<T>(this List<T> lines, File_attribute fa)
{
    List<string> mylist = lines.Select(x => x.ToString()).ToList();
    ...............
    ...............
publicstaticvoidcreatefile(此列表行,文件属性fa)
{
列出mylist=行。选择(x=>x.ToString()).ToList();
...............
...............

这里有一种可能的替代方法,使用
字符串。加入

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)
     );
}
publicstaticvoidcreatefile(此列表行,文件属性fa)
{
File.writealText
(
Path.Combine(fa.output文件夹,fa.FileName),
juin(Environment.NewLine,line)
);
}

因此
string.Join
将在内部调用
Object.ToString()

这里有一种可能的替代方法,使用
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)
     );
}
publicstaticvoidcreatefile(此列表行,文件属性fa)
{
File.writealText
(
Path.Combine(fa.output文件夹,fa.FileName),
juin(Environment.NewLine,line)
);
}
因此
string.Join
将在内部调用
Object.ToString()

公共静态void CreateFile(此列表行)
{
List mylist=新列表();
var props=typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
foreach(行中的var项目)
{
foreach(道具中的var道具)
{
var val=道具获取值(项目);
//对val执行任何操作,都可以对其调用ToString()
}
}
}
公共静态void CreateFile(此列表行)
{
List mylist=新列表();
var props=typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
foreach(行中的var项目)
{
foreach(道具中的var道具)
{
var val=道具获取值(项目);
//对val执行任何操作,都可以对其调用ToString()
}
}
}

只需使用
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());
    }
}
publicstaticvoidcreatefile(此列表项,文件属性fa)
{
使用(System.IO.StreamWriter file=new System.IO.StreamWriter(fa.OutpoutFolder+fa.FileName))
{
foreach(项目中的T项目)
file.WriteLine(item.ToString());
}
}

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

只需使用
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());
    }
}
publicstaticvoidcreatefile(此列表项,文件属性fa)
{
使用(System.IO.StreamWriter file=new System.IO.StreamWriter(fa.OutpoutFolder+fa.FileName))
{
foreach(项目中的T项目)
file.WriteLine(item.ToString());
}
}

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

尽管所有内容都来自
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());
        }
     }
}
publicstaticvoidcreatefile(此列表行,文件属性fa),其中T:ILine
{
使用(System.IO.StreamWriter file=new System.IO.StreamWriter(System.IO.Path.Combine(fa.output文件夹,fa.FileName)))
{
foreach(行中的行)
{
file.WriteLine(lin.GetLineOutput());
}
}
}

一些旁注

  • 创建包含可变部分的文件路径时,应使用
    System.IO.path.Combine
    组合这些部分
  • 很好地使用了一个流,并且一行一行地写入,而不是一次写入,这可能会导致内存问题。也很好地为流使用

  • 尽管一切都源自
    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());
            }
         }
    }
    
    publicstaticvoidcreatefile(此列表行,文件属性fa),其中T:ILine
    {
    使用(System.IO.StreamWriter file=new System.IO.StreamWriter(System.IO.Path.Combine(fa.output文件夹,fa.FileName)))
    {
    foreach(行中的行)
    {
    file.WriteLine(lin.GetLineOutput());
    }
    }
    }
    

    一些旁注

  • 创建包含可变部分的文件路径时,应使用
    System.IO