[英]CSV file to class via Linq
使用下面的代碼,在foreach
,我得到一個例外。
我在csv
(第二行)上放置斷點,我展開結果,我看到2個條目沒問題。
當我在foreach
的csv
上做同樣的事情時,我得到了一個激動: 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; }
}
也許這樣的事情會給你你想要的東西:
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
如何能夠正常工作。
Perhabs是因為LINQ不直接讀取所有項目,只是在需要時創建它讀取的連接。
你可以嘗試施放:
var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();
我懷疑它是yield
關鍵字(在Select()
)和內部文本閱讀器(在ReadLines
)不是“同意”的組合。
將lines變量更改為var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();
那應該排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.