【问题标题】:Checking For null in Lambda Expression在 Lambda 表达式中检查 null
【发布时间】:2012-05-14 17:59:42
【问题描述】:

在下面的代码中,我试图从列表中获取 null、空字符串和源组件。我还没有测试过这段代码,但我的直觉告诉我,如果它来自一个空值,它会在过滤源和空字符串的列表时中断。

我尝试先提取空值,但我仍在过滤基本列表。我怎样才能重新编写这段代码,以最好的方式完成我想要做的事情?

List<LineItem> nullList=itemsList.Where(s => s[Constants.ProductSource] == null)
                                 .ToList();

NALineItems = itemsList.Where(s => s[Constants.ProductSource] == source 
                                   || s[Constants.ProductSource] == String.Empty)
                       .ToList();

NALineItems = nullList.Union(NALineItems).ToList(); 

s[Constants.ProductSource] 是 Microsoft 电子商务 PurchaseOrder 对象的附件属性。它基本上是对象的另一个属性。

【问题讨论】:

  • “我还没有测试过这段代码,但我的直觉告诉我它会崩溃”这意味着你过早地问了这个问题。
  • 你知道 String.IsNullOrEmpty 吗?
  • itemsList 是否包含数组?这是什么s[Constants.ProductSource]
  • 我们应该知道我们的代码在这些情况下是否会在没有先测试的情况下中断。这部分是我想要完成的。
  • 我不同意——如果你已经有一些代码尝试一下,写一些测试(写你认为可能会先中断的测试!)——它有价值,下次你会遇到类似的事情,你会知道会发生什么。

标签: c# linq


【解决方案1】:

基于“我正在尝试从列表中获取 null、空字符串和源组件”,我假设您的意思是您想要一个包含这 3 个特定值的列表。

var allItems = itemsList
                 .Where(s => string.IsNullOrEmpty(s[Constants.ProductSource])
                             || s[Constants.ProductSource] == source)
                 .ToList()

【讨论】:

  • 我认为你的意思是 "|| s[Constants.ProductSource] == source" 使用 == 而不是 =,否则可能会发生奇怪的事情。
  • 是的,感谢您的更正!实际上它甚至不会编译。
【解决方案2】:

您是否有理由不能将表达式合并为一个?我还会添加一个检查该键是否存在于字典中:

List<LineItem> NALineItems = itemsList.Where(s =>
    s.ContainsKey(Constants.ProductSource) && (
        String.IsNullOrEmpty(s[Constants.ProductSource]) ||
        s[Constants.ProductSource] == source))
    .ToList();

【讨论】:

  • 有趣..字典是在哪里定义的?我不知道这个
  • 我假设 itemslist 是您代码中的字典列表,但它也可以是列表列表(如果 Constants.ProductSource 是整数)。我必须查看更多上下文。
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多