【问题标题】:Factoring Code C# LINQ [closed]分解代码 C# LINQ [关闭]
【发布时间】:2016-07-13 13:20:30
【问题描述】:

我想知道是否可以使用此代码进行一些重构:

string code_region = "";
code_region = listeRegions.Single(x => x.nom == nvc[index + 1]).code_region; 
dt.code_region=code_region;

在此代码中,nvc[index+1] 值可以为 null 或为空,因此我不希望我的 Linq 查询引发异常...

我想知道是否有办法进行内联 LINQ 查询?我应该改用 FirstOfDefault 吗?

提前感谢您的帮助:)

【问题讨论】:

  • 这属于代码审查,你会在那里得到更好的回应,除非 Jon Skeet 直接在我的评论下方。
  • 那么,如果没有匹配项,您希望发生什么?为什么你在第一行给code_region赋值,只是为了重新赋值? (我强烈建议您修改您的名称以遵循 .NET 命名约定,顺便说一句。)
  • @JonSkeet :是的,变量名称是对的,但这只是一个示例,如果没有匹配项,我想返回空值...
  • 为什么不放一个if条件?
  • 空或空? minimal reproducible example 会让它更清晰...我建议您即使在示例代码中也遵循约定...毕竟,您想让读者尽可能简单和熟悉,对吧?

标签: c# linq refactoring


【解决方案1】:

从 cmets 看来,您似乎确定索引在范围内,因此您只想解决找不到匹配项时发生的异常。

SingleOrDefault 将返回默认值(在这种情况下为 null),因此您可以使用它,检查 null,并在有结果的情况下返回 code_region

但是,您可以通过直到最后才“离开 monad”来避免检查。使用WhereSelect 按您的条件过滤并选择项目的code_region,然后调用SingleOrDefault。这样,您将获得匹配的项目code_region,或者当没有符合您的条件的项目时,您将获得 null。

 var code_region = listeRegions
    .Where(x => x.nom == nvc[index + 1])
    .Select(x => x.code_region)
    .SingleOrDefault();

【讨论】:

    【解决方案2】:

    我的两粒沙子:

    // Convert to string to let it work against an SQL database
    var nvcStr =  nvc[index + 1];
    
    // Avoid exception if no match - FirstOrDefault
    var code_region_obj = listeRegions.FirstOrDefault(x => x.nom == nvcStr); 
    dt.code_region=code_region_obj == null?string.empty:code_region_obj.code_region;
    

    【讨论】:

    • 谢谢@jorge 就是这样!!第三行的最终语法是: dt.code_region = code_region_obj == null ? string.Empty : code_region_obj.code_region;
    • 是的,一个错字:) 我会改正的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多