6

私は非常に奇妙な問題を抱えているようで、何が起こっているのか本当にわかりません。これは私がデバッグしようとしているソースコードです

StorageFile file = await roamingFolder.GetFileAsync(filename);
string text = await FileIO.ReadTextAsync(file);

string[] shows = text.Split(new[] { ":?;" }, StringSplitOptions.None);
List<show> showslist = new List<show>();

foreach (string splitshow in shows)
{
    string[] show1 = splitshow.Split(new[] { ",?;" }, StringSplitOptions.None);
    episode = show1[0];
    name = show1[1];

    showslist.Add(new show { name = name, episode = episode });
}

Output.ItemsSource = showslist;

奇妙なことに、リストはOutput.ItemsSource = showslist;foreachループの内側に配置した場合にのみ表示されますが、外側に配置した場合には表示されず、なぜそうでないのか本当にわかりません。リストの要素はすでに追加されているのではないですか?

多くの異なる方法を試しましたが、リストデータに表示されたとしても、それらのほとんどには、修正するには面倒な多くの異なる問題がありました。

とにかくヒントや助けに感謝します、ありがとう。

4

1 に答える 1

9

あなたのデータは正確には正しくないに違いありません。後/最後のエントリの1つが例外をスローしていて、コードの上位に飲み込まれている(またはロガー/ UIに報告されていない)と思います。foreachデータソースを割り当てる前に、ループを完了してメソッドを終了することはありません。

2番目の分割であるエントリの1つには実際には区切り文字が含まれていない,?;ため、show1配列の長さは1のみであり、「名前」エントリは含まれていません。アクセスしようとするとshow1[1]、がスローされますIndexOutOfRangeException

余談ですが、より単純な区切り文字を使用して調査することをお勧めします。さらに、データの読み取りに何らかの形式のXML(またはJSON、またはその他)のシリアル化を利用することをお勧めします。

編集:コメントの投稿されたコードサンプルから、問題は最後のエントリであることがわかります。を指定するとhlj,?;lljhjh:?;hhmm,?;drr:?;oo,?;hello:?;ff,?;ff:?;、の最初のString.Split操作で:?;最後のエントリとして空の文字列が生成されます。したがって、2番目の分割を実行しようとする,?;と、空に対して分割され、単一のエントリを持つ配列が返されますString.Empty。ヒットshow1[1]すると、例外がスローされます。

最初の分割を使用するように変更するStringSplitOptions.RemoveEmptyEntriesと、空のエントリが削除されます。

string[] shows = text.Split(new[] { ":?;" }, StringSplitOptions.RemoveEmptyEntries);

必要に応じて、次のようなチェックを追加して、if (show1.Length == 2)不正なデータを回避できます(ただし、修正できるように報告することをお勧めします)。プログラムがこの不良データ自体を書き込んでいる場合は、有効なデータを常に書き込んだり読み取ったりしていることを確認するために、いくつかの簡単な単体テストを行う必要があります。

于 2012-12-31T16:01:27.710 に答える