0

使用下面的代码,在 上foreach,我得到一个异常。

我在(第二行)放置断点csv,展开结果,我看到 2 个条目没问题。

当我在csvin上做同样的事情时foreach,我得到一个 excpetion:can't read from closed text reader.

任何的想法 ?

谢谢,

我的 CSV 文件:

A0;A1;A2;A3;A4
B0;B1;B2;B3;B4

编码

var lines = File.ReadLines("filecsv").Select(a => a.Split(';'));
IEnumerable<IEnumerable<MyClass>> csv =
    from line in lines
    select (from piece in line
            select new MyClass
            {
                Field0 = piece[0].ToString(),
                Field1 = piece[1].ToString()
            }
    ).AsEnumerable<MyClass>();

foreach (MyClass myClass in csv)
    Console.WriteLine(myClass.Field0);
Console.ReadLine();

我的课 :

public class MyClass 
{
    public string Field0 { get; set; }
    public string Field1 { get; set; }
}
4

3 回答 3

2

也许像这样的东西,会给你你想要的东西:

var jobs = File.ReadLines("filecsv")
               .Select(line => line.Split(','))
               .Select(tokens => new MyClass { Field0 = tokens[0], Field1 = tokens[1] })
               .ToList();

您遇到的问题是您正在保存Enumerable延迟执行的 . 然后,您通过调试器查看它,该调试器循环遍历文件,完成所有工作并处理它。然后你尝试再做一次。

上面的代码实现了你当前想要的,更简洁,并强制转换为列表,这样惰性行为就消失了。

另请注意,我看不出您from piece in line目前如何正常工作。

于 2012-04-26T11:45:16.003 回答
0

可能是因为 LINQ 不会直接读取所有项目,它只是在需要时创建它读取的连接。

您可以尝试投射:

var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();
于 2012-04-26T11:35:01.337 回答
0

我怀疑这是yield关键字(在 中使用Select())和内部文本阅读器(在 中ReadLines)的组合,而不是“同意”。

将行变量更改为var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();

那应该排序它。

于 2012-04-26T11:37:03.273 回答