C#如何将数组中的字符串元素添加到字符串中

时间:2009-12-27 16:47:41

标签: c# arrays string

需要帮助才能做到这一点。或者有关如何将字符串添加到数组中的字符串元素的建议?

  1. 我们有2个txt文件,每个文件包含100个或更多字符串:

    DOMAIN.txt文件
    DOMAIN1
    DOMAIN2
    ..
    title.txt
    TITLE1
    tilte2
    ..

  2. 我们有:

    string link =< a h ref =“http://www.domain.com”target =“_ blank”> title< / A>

  3. 在读取文件后,我们将有2个字符串数组 - 我们需要用domain.txt和title中的每个字符串替换domain.com,每个字符串都来自title.txt,如下所示:

    < a h ref =“http://www.domain1.com”target =“_ blank”> title1< / A>
    < a h ref =“http://www.domain2.com”target =“_ blank”> title2< / A>
    ..

  4. 以这种方式将结果字符串数组保存为2个txt文件:从1-50个字符串到
    1.txt和50-100到2.txt文件

  5. 通过使用字符串数组元素操作字符串来实现此目的的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

这可能是阅读文件的最简单方法:

    string[] domains = File.ReadAllLines("domain.txt");
    string[] titles = File.ReadAllLines("titles.txt");

要进行替换,您可以使用string.Format

    int n = domains.Length;
    string[] results = new string[n];

    for (int i = 0; i < n; ++i)
    {
        results[i] = string.Format(
            @"<a href=""http://{0}"" target=""_blank"">{1}</a>",
            domains[i], titles[i]);
    }

要编写输出,您可以使用Linq:

    File.WriteAllLines("file1.txt", results.Take(n / 2).ToArray());
    File.WriteAllLines("file2.txt", results.Skip(n / 2).ToArray());

如果您的模板是参数,您可能想要动态构造格式字符串而不是硬编码。以下是如何做到这一点的示例:

using System;
using System.IO;
using System.Linq;

class Program
{
    static string escapeBraces(string s)
    {
        return s.Replace("{", "{{").Replace("}", "}}");
    }

    static string createFormatString(string template, params string[] parameters)
    {
        template = escapeBraces(template);

        for (int i =0; i < parameters.Length; ++i) {
            template = template.Replace(
                escapeBraces(parameters[i]),
                "{" + i + "}");
        }

        return template;
    }

    static void Main(string[] args)
    {
        string template = @"<a {}href=""http://www.domain.com"" target=""_blank"">title</a>";
        string formatString = createFormatString(template, "www.domain.com", "title");

        string[] domains = File.ReadAllLines("domain.txt");
        string[] titles = File.ReadAllLines("title.txt");

        int n = domains.Length;
        if (titles.Length != n)
            throw new InvalidDataException("There must be the same number domains and titles.");

        string[] results = new string[n];
        for (int i = 0; i < n; ++i)
        {
            results[i] = string.Format(formatString, domains[i], titles[i]);
        }

        File.WriteAllLines("file1.txt", results.Take(n / 2).ToArray());
        File.WriteAllLines("file2.txt", results.Skip(n / 2).ToArray());
    }
}

答案 1 :(得分:2)

使用LINQ和File中的一些不错的方法,这很漂亮:

string[] domains = File.ReadAllLines(@"C:/domains.txt");
string[] titles = File.ReadAllLines(@"C:/titles.txt");
if(domains.Length != titles.Length) { throw new InvalidOperationException(); }
string link = "<a href=\"http://www.{0}.com\" target=\"_blank\">{1}</a>";
var results = domains.Select((domain, i) => String.Format(link, domain, titles[i]));
File.WriteAllLines("results1.txt", results.Take(results.Length / 2).ToArray());
File.WriteAllLines("results2.txt", results.Skip(results.Length / 2).ToArray());

如果有超过一百个域/标题对,那么你不清楚你想要什么,所以我将它们分成两半。

答案 2 :(得分:0)

另一种方法就是懒散地这样做:

        static IEnumerable<string> ReadLinesLazily(string file)
    {
        using (var reader = new StreamReader(file))
        {
            string line = null;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }

    static void Combine()
    {
        const string link = "<a href=\"{0}\">{1}</a>";
        var links = ReadLinesLazily("domains.txt").Zip(ReadLinesLazily("titels.txt"), (d, t) => String.Format(link, d, t))
        // write links here
    }