将字符串数组链接到文件C#

时间:2011-12-22 14:09:25

标签: c# arrays file

我有三个字符串数组,我想将它们组合起来并将它们写入文件(S1 [] + S2 [] + S3 [])。 这样做的最佳方式是什么?

7 个答案:

答案 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.WriteAllLinesFile.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);