【问题标题】:Parsing text file containing hierarchical items using linq使用 linq 解析包含分层项目的文本文件
【发布时间】:2013-11-24 05:37:11
【问题描述】:

我正在重写一些代码,并尽可能地尝试使用 Linq。我现在的问题是一个简单的文件导入功能。

文件基本上是这样的:

A1
B1|1882
C1|7315808907578
B9
B1|1883
C1|4025595431639
C1|8717734091786
C1|8717734091809
C1|8717734098280
C1|8717795041874
C1|8717795060998
C1|8717795108973
B9
B1|1884
C1|4025595732071
C1|7315808887184
C1|8717734001983
B9
A9

现有代码如下所示:

line = reader.ReadLine();
string itemNo = "";
List<AltItems> list = new List<AltItems>();
while (line != null) {
    posts = line.Split(postSep);
    if (posts.Length == 0) { }
    else if (posts[0].Equals("A1")) { }
    else if (posts[0].Equals("B1"))
        itemNo = posts[1];
    else if (posts[0].Equals("C1")) {
        string altItemNo = posts[1];
        list.Add(new AltItems() { ItemNo = itemNo, AltItemNo = altItemNo });
    }
    line = reader.ReadLine();
}

等效的 Linq 查询会是什么样子?关于使用 Linq 重写此代码的性能损失有什么想法吗?我还有具有多个层次级别的文件,其中需要来自第一级项目的数据来构建第三级项目...

【问题讨论】:

  • “分层”部分不清楚。但如果您需要在枚举期间访问集合的不同索引,则 LINQ 并不是最好的工具。
  • 仅仅因为代码有效并不意味着您应该将所有内容都转换为 LINQ - 没有任何意义。 LINQ 确实是为数据库语言和编程语言设计的,以便在用 LINQ 编写时具有某种形式的意义。我并不是说 LINQ 是一种在 .NET 框架上执行的数据库语言。您将获得与现在相同的性能和输出。
  • 由于您需要将上下文向前推进(itemNoaltItemNo),因此您不太可能获得漂亮的 LINQ 语句。考虑使用 Aggregate,因为它旨在在迭代期间承载上下文。

标签: c# linq


【解决方案1】:

我同意艾哈迈德·伊利亚斯的观点。在 LINQ 中重写所有内容并不意味着它会运行得更快。

特别是关于字符串解析,你应该知道它在 LINQ 中是不支持的。如果您认为 LINQ 是一种以统一方式针对多种数据源的查询语言,这是绝对合理的。有办法做到这一点,但它们总是过于间接,我并不特别喜欢它们。其中之一是使用 Scott Guthry 的 DynamicLinq 库,它建议使用 here 的方式。

请注意,我只向您展示了一种使用 LINQ 进行字符串解析的方法。 这并不意味着我会建议使用 LINQ 来替换条件代码。

希望我能帮上忙!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多