0

以下のコードでは、 でforeach例外が発生します。

(2 行目) にブレークポイントを配置csvし、結果を展開すると、2 つのエントリが表示されますが、問題ありません。

で同じことをするとcsvforeach例外が発生します。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

yieldキーワード ( で使用Select()) と内部テキスト リーダー ( )の組み合わせがReadLines「同意」していないと思われます。

lines 変数をに変更しますvar lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();

それはそれをソートする必要があります。

于 2012-04-26T11:37:03.273 に答える
0

おそらく、LINQ はすべてのアイテムを直接読み取るのではなく、必要に応じて読み取った接続を作成するだけだからです。

あなたはキャストしようとすることができます:

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