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