【问题标题】:Creating Tuple array from File从文件创建元组数组
【发布时间】:2017-01-04 15:45:35
【问题描述】:

我有一个包含文本和数字的文件,需要将其导入Tuple<string, int> 数组 (Tuple<string, int>[] vowels = new Tuple<string, int>[81])。该文件看起来像这样

a,2,e,6,i,3,o,8,u,2,y,5

我使用的当前方法最初使用

将其导入字符串数组

string[] vowelsin = File.ReadAllText("path.txt").Split(',');

导入后,我将数据转换为元组使用

    for (int x = 0; x < 81; x++)
        vowels[x] = Tuple.Create(vowelin[x*2], int.Parse(vowelin[(x*2) + 1]));

虽然它有效,但阅读起来有点困难,并且在测试期间,大约需要 100 毫秒才能完成。是否有任何潜在的单行方法、更快的方法或更具可读性的方法可以实现相同的目标?

【问题讨论】:

  • 使用 String.Split 会极大地浪费性能。通过逐字符迭代内容并采取相应措施,可以更快地编写它。

标签: c# arrays io tuples


【解决方案1】:
string[] vowelsin = File.ReadAllText("path.txt").Split(',');
vowles = vowelsin.Zip(vowelsin.Skip(1), 
                           (a, b) => new Tuple<string, string>(a, b))
                      .Where((x, i) => i % 2 == 0)
                      .ToArray();

【讨论】:

  • 虽然不禁止仅使用代码的答案,但请理解这是一个问答社区,而不是众包社区,并且通常,如果 OP 理解作为答案发布的代码,他/她会自己想出一个类似的解决方案,并且不会一开始就发布问题。同样的原则也适用于任何可能不熟悉所呈现代码的未来读者。因此,请通过解释其工作原理和/或原因来为您的答案和/或代码提供上下文。
【解决方案2】:

您可以使用 KeyValuePairDictionary 代替元组。

据此article 元组比 KeyValuePair 快。你可以找到更多观点here

另一方面,字典和元组之间的比较是here

好消息来了:

从 C#7.0 开始,引入了关于元组的新功能:

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

这是使用元组的新方法:(type, ..., type),这意味着该方法将返回多个值(本例中为三个)。

该方法现在有效地返回三个字符串,包装为元组值中的元素。

方法的调用者现在将收到一个元组,并且可以单独访问元素:

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

更多信息可以在这里找到What is new in C# 7.0在那里你会发现这些新元组相对于System.Tuple的优势

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2011-01-12
    • 2017-09-03
    • 2012-02-01
    • 2011-04-11
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多