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

我敢打赌,您的数据并不完全正确。我认为后来/最后的条目之一是引发异常,并且它在您的代码中被更高的吞没(或者没有被报告给您的记录器/用户界面)。foreach在您分配数据源之前,它永远不会完成循环并退出该方法。

我猜您的第二次拆分,其中一个条目实际上并不包含您的分隔符,?;,因此该show1数组的长度仅为 1 并且不包含“名称”条目。当您尝试访问show1[1]时,它会抛出一个IndexOutOfRangeException.

顺便说一句,我是否建议您使用更简单的分隔符进行调查,或者更好的是,使用某种形式的 XML(或 JSON,或其他)序列化来读取您的数据。

编辑:我从您在评论中发布的代码示例中看到,问题是最后一个条目。给定hlj,?;lljhjh:?;hhmm,?;drr:?;oo,?;hello:?;ff,?;ff:?;,您的第一个String.Split操作:?;将产生一个空字符串作为最后一个条目。因此,当您尝试对其执行第二次拆分时,,?;它会拆分为空并返回一个包含单个条目的数组String.Empty。当你点击show1[1]异常时抛出。

如果您将第一个拆分更改为使用StringSplitOptions.RemoveEmptyEntries它应该消除空条目:

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

如果您愿意,您可以添加一个检查,这样if (show1.Length == 2)您就可以避免不良数据(但也许您更愿意报告它以便修复它)。如果您的程序本身正在编写这些不良数据,也许您应该进行一些快速的单元测试,以确保您始终在写入/读取有效数据。

于 2012-12-31T16:01:27.710 回答