列表计数与列表空条件,更改结果

时间:2014-06-20 16:41:19

标签: c# count

我有一个程序,它首先遍历文件数据,然后将(JSON)数据转换为Object。对象取决于我尝试访问数据的文件。对于我要问的问题,这几乎是无关

当我完成项目,并准备将其发送给我的朋友时,我发现有一件事我对C#的List<>没有了解。

以下是我使用的代码:

// File is not empty!
string file = File.ReadAllText(new MainWindow().getFileName("events"));
List<Event> events = JsonConvert.DeserializeObject<List<Event>>(file);

在此之后,我尝试在我遇到的每个事件中填充ListView,或者我尝试使用文字填充TextBlock,现在没有事件创建一个。

我正在使用这种情况。

if(events != null) {
   // goes well
} else {
   // populate the code text view 
}

在此代码中,else块不会被触发。如果有事件,它会填充列表,否则它只会跳过textView更新代码。

enter image description here

但是,如果我使用此代码,

if(events.Count != 0) {
   // listview code..
} else { 
   // populate text view
}

使用它,我可以填充textView,我可以在页面中看到错误消息。

enter image description here

我已经添加了代码图像,以及它的工作示例。希望有人可以告诉我差异

(List.Count == 0) || (List == null) 
/* irrelevant piece of code, I'm trying to ask, should I use 
 * List Count == 0 OR List is equal to null */

2 个答案:

答案 0 :(得分:6)

对于某些列表变量

List<SomeType> list = // initialization

可能会发生变量list未正确初始化且未设置任何对象的情况。在这种情况下,变量的值为null。虽然

  • list == null评估为true
  • list.Count会抛出NullReferenceException

另一方面,如果可以获得列表。然后,您将能够在列表中调用Count,该列表告知该列表中的元素数量。虽然

  • list == null评估为false
  • 如果列表中没有元素,则
  • list.Count == 0评估为true;如果列表中至少包含一个元素,则评估为false

为了安全起见(不仅仅是编程偏执狂),最好检查变量是否为空。我的意思是检查您从中获取对象的API的文档。

如果您知道它可能为null,则需要先检查list == null来解决这种情况。如果你不知道你可能应该检查null。我建议检查null,如果是,请在列表中指定一个空列表。

List<SomeType> list = // initialization
list = (list == null) ? new List<SomeType>() : list;

if(list.Count == 0) 
  // do whatever you like here
else
  // or even here

或者将初始化放入另一个专门用于检索列表的方法中。如果它以某种方式失败,则返回一个空列表。这样,您只需检查一个条件即可处理以下所有代码。条件list.Count == 0

List<SomeType> RetrieveList()
{
    List<SomeType> list = // initialization possibly null
    return (list == null) ? new List<SomeType>() : list;
}

希望这有帮助

答案 1 :(得分:2)

documentation并未说明JsonConvert.DeserializeObject的实际回报值。

但似乎List<Event> events = JsonConvert.DeserializeObject<List<Event>>(file);从未将事件设置为null,这就是您的代码

的原因
if(events != null) {
   // goes well
} else {
   // populate the code text view 
}

没有做它应该做的事情。

但它(JsonConvert)可以返回一个空列表。这就是为什么这些代码能够实现它应该完成的目标:

if(events.Count != 0) {
   // listview code..
} else { 
   // populate text view
}

因为如果解析失败JsonConvert.DeserializeObject,则返回空列表。

好吧,(List.Count == 0) || (List == null)应该写成(List == null) || (List .Count == 0),因为如果列表以某种方式变为空,则会出现意外的NulReferenceException。有关详细信息,请参阅Execution order of conditions in C# If statement

JsonConvert的行为可能会发生变化,因此最好使用

if ((events == null) || (events.Count == 0)) {
   // Error handling - populate text view
} else { 
   // Everything is ok - listview code..
}