我如何将元组列表写入磁盘
How can i write to disk a List of Tuples
我有一个包含(100 万)个元组的列表,其中包含一些字段,我想将它们像每行一个 CSV 1 元组一样写入磁盘。以前我使用的是 List 并且我使用以下命令保存列表
File.WriteAllLines(Configs.customers_file, customer_list);
现在我已经将列表转换为以下元组
List<(int id, string customer, bool status, bool active)> customers = List<(int id, string customer, bool status, bool active)>();
...populate list here
// save customers to Disk
我可以使用 foreach,但我认为它花费的时间太长,还有其他方法可以保存元组列表吗?
foreach (var customer in customers)
您可以使用 LINQ Select 转换您希望写入文件的任何字符串中的列表项。它们将按顺序有效地编写。因为 Select 是惰性的,所以你不会分配另一个列表。
File.WriteAllLines(Configs.customers_file, customer_list.Select(x => CreateLine(x)));
一般情况下,我们把null
转成空串,必要时加引号转义"
:
using System.Linq;
using System.IO;
...
private static readonly char[] csvSymbols = new char[] {
'\r', '\n', '"', ','
};
private static string Enquote(string value) {
if (null == value)
return "";
return csvSymbols.Any(symbol => value.Contains(symbol))
? $"\"{value.Replace("\"", "\"\"")}\"";
: value;
}
然后我们可以把元组的每个属性变成需要的字符串:
List<(int id, string customer, bool status, bool active)> customers = ...
...
File.WriteAllLines(@"c:\myFile.cs", customers
.Select(customer => string.Join(",",
customer.id,
Enquote(customer.customer),
customer.status ? "Y" : "N", // or whatever bool representation
customer.active ? "Y" : "N"
)));
我有一个包含(100 万)个元组的列表,其中包含一些字段,我想将它们像每行一个 CSV 1 元组一样写入磁盘。以前我使用的是 List
File.WriteAllLines(Configs.customers_file, customer_list);
现在我已经将列表转换为以下元组
List<(int id, string customer, bool status, bool active)> customers = List<(int id, string customer, bool status, bool active)>();
...populate list here
// save customers to Disk
我可以使用 foreach,但我认为它花费的时间太长,还有其他方法可以保存元组列表吗?
foreach (var customer in customers)
您可以使用 LINQ Select 转换您希望写入文件的任何字符串中的列表项。它们将按顺序有效地编写。因为 Select 是惰性的,所以你不会分配另一个列表。
File.WriteAllLines(Configs.customers_file, customer_list.Select(x => CreateLine(x)));
一般情况下,我们把null
转成空串,必要时加引号转义"
:
using System.Linq;
using System.IO;
...
private static readonly char[] csvSymbols = new char[] {
'\r', '\n', '"', ','
};
private static string Enquote(string value) {
if (null == value)
return "";
return csvSymbols.Any(symbol => value.Contains(symbol))
? $"\"{value.Replace("\"", "\"\"")}\"";
: value;
}
然后我们可以把元组的每个属性变成需要的字符串:
List<(int id, string customer, bool status, bool active)> customers = ...
...
File.WriteAllLines(@"c:\myFile.cs", customers
.Select(customer => string.Join(",",
customer.id,
Enquote(customer.customer),
customer.status ? "Y" : "N", // or whatever bool representation
customer.active ? "Y" : "N"
)));