【发布时间】: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 框架上执行的数据库语言。您将获得与现在相同的性能和输出。
-
由于您需要将上下文向前推进(
itemNo、altItemNo),因此您不太可能获得漂亮的 LINQ 语句。考虑使用 Aggregate,因为它旨在在迭代期间承载上下文。