我有三个字符串数组,我想将它们组合起来并将它们写入文件(S1 [] + S2 [] + S3 [])。 这样做的最佳方式是什么?
答案 0 :(得分:1)
假设您只想组合数组以将它们写入文本文件。 。
using(var writer = new StreamWriter("MyFile.txt"))
{
foreach(var item in arr1.union(arr2).union(arr3))
writer.WriteLine(item)
}
这个答案激起了“一次写入比写许多辩论更快”,我想在答案正文中解决这个问题。
首先,对于少量数据的任何一种方法都不会以某种方式产生太大差异。实际上,在现代系统中,对于兆字节范围内的大小(可能更大),性能差异不会很大(此时我没有对任何基准进行基准测试,但我会直接将资金投入磁盘IO)
问题实际上是可扩展性问题,如果你的系统处于负载状态,并且你有几百万个数据,那么“缓冲优先”方法将会大大减慢,你正在为自己做好准备操作系统页面出现故障的整个世界,特别是如果您的数据分布在多个页面上,您将不断地交换内存页面,这不仅会降低您的应用程序速度,还会降低整个计算机的速度。
我现在会编写一些代码来对这两种方法进行基准测试,我会很快发布代码和结果。
结果是,实际上没有太大的性能差异。对于12k的数据* 100次写入(显然在我的机器上)大约1分38秒。在重复运行时,直接到磁盘更快,但从不超过半秒。
真正的惊喜是File.WriteAllLines
和File.AppendAllLines
花了8分35秒。我没有尝试联合数组并调用File.WriteAllLines
一次(从.net 4.0开始),但我认为它会更好,延迟可能是多次打开文件。
鉴于差异(如预测的那样)对于少量数据可以忽略不计,我选择使用更简单的代码,并将字符串直接写入文件。
我没有多次运行它,因为它需要时间,如果有人想要设置它运行过夜并获得更准确的趋势,请成为我的客人。
public static void Main(string[] args)
{
var arr1 = BuildArr(1000000);
var arr2 = BuildArr(1000000);
var arr3 = BuildArr(1000000);
DoDirectToDisk(arr1, arr2, arr3);
DoBuffered(arr1, arr2, arr3);
DoWriteLines(arr1, arr2, arr3);
}
private static void DoWriteLines(string[] arr1, string[] arr2, string[] arr3)
{
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100; i++)
{
File.WriteAllLines(@"C:\WriteLines.txt", arr1);
File.AppendAllLines(@"C:\WriteLines.txt", arr1);
File.AppendAllLines(@"C:\WriteLines.txt", arr1);
}
sw.Stop();
Console.WriteLine("Write Lines {0}", sw.Elapsed);
}
private static void DoBuffered(string[] arr1, string[] arr2, string[] arr3)
{
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100; i++)
{
using (var writer = new StringWriter())
{
foreach (var item in arr1.Union(arr2).Union(arr3))
writer.WriteLine(item);
File.WriteAllText(@"C:\buffered.txt", writer.ToString());
}
}
sw.Stop();
Console.WriteLine("Buffered {0}", sw.Elapsed);
}
private static void DoDirectToDisk(string[] arr1, string[] arr2, string[] arr3)
{
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100; i++)
using (var writer = new StreamWriter(@"C:\Direct.txt"))
{
foreach (var item in arr1.Union(arr2).Union(arr3))
writer.WriteLine(item);
}
sw.Stop();
Console.WriteLine("Direct To Disk took {0}", sw.Elapsed);
}
上次运行输出
Direct To Disk采用00:01:38.2458291
缓冲00:01:39.0499939
写行00:08:35.5900614
答案 1 :(得分:1)
我不知道它是否是最好的方式,但其中一个更简单就是:
File.WriteAllLines(fileName, S1.Union(S2).Union(S3));
答案 2 :(得分:0)
假设您要将所有Array的内容写入TextFile 你可以用
做到这一点List<string>
(System.Collections.Generic命名空间)FileStream
(System.IO名称空间)StreamWriter
(System.IO名称空间)string[] a1 = new string[] { "Text1", "Text2" };
string[] a2 = new string[] { "Another Text1", "Another Text2" };
List<string> list = new List<string>();
list.AddRange(a1);
list.AddRange(a2);
using (FileStream str = new FileInfo(@"C:\MyFilePath.txt").OpenWrite())
{
StreamWriter writter = new StreamWriter(str);
writter.Write(string.Join(Environment.NewLine, list));
writter.Close();
}
答案 3 :(得分:0)
使用LINQ:
var s1 = new string[0]; var s2 = new string[0]; var s3 = new string[0];
using (var writer = new StreamWriter("c:\temp.text.txt"))
{
writer.Write(s1.Union(s2).Union(s3).Aggregate(string.Empty, (current, var) => current + var));
}
答案 4 :(得分:0)
您可以使用System.IO.File.AppendAllLines
方法在特定文件中追加所有字符串行。
答案 5 :(得分:0)
using System.IO;
var combinedList = a1.ToList().AddRange(a2);
var combinedArray = list.ToArray();
using (var stream = new StreamWriter(filename))
{
stream.Write(combinedArray, 0, combinedArray.Length);
}
答案 6 :(得分:0)
将所有字符串组合在一起:
var allStrings = new List<string>();
allStrings.AddRange(S1);
allStrings.AddRange(S2);
allStrings.AddRange(S3);
其中S1,S2和S3是您引用的字符串数组。
要写入标准文本文件,其中所有字符串都以空格连接(作为示例):
string text = string.Join(" ", allStrings.ToArray());
System.IO.File.WriteAllText(@"C:\Path\To\Some\File.txt", text);