拖放“ Where”并将条件移到LINQ的“ First”中

时间:2018-07-20 10:11:55

标签: c# linq sonarqube

我有一个Windows应用程序,该应用程序具有如下类似的代码。
作为名为Order的类。

class Order{
 public string Orderid { get; set; }
 public string CustName { get; set; }
}

现在,在此应用程序的另一个类中,将创建Order类的对象,并为其分配值。

Order order = new Order();
order = JObject.Parse(some JSON data).ToObject<Order>();

现在,我想基于CustName中的Orderid提取order。为此,我使用了LINQ。

string custName = order.Where(s => s.Key == "o123").First().Value;

我正在使用Sonarqube来检查代码质量。当我运行SonarQube工具时,表明需要在使用LINQ的地方重构代码。这是它显示的确切行。

Drop 'Where' and move the condition into the 'First'.

我已经搜索了很多,但是不明白它要说的是什么。谁能解释我如何重构此行,以使其符合SonarQube的期望。
任何输入都非常有帮助。谢谢。

2 个答案:

答案 0 :(得分:6)

使用First lambda表达式可以分两个步骤进行操作

string custName = order.First(s => s.Key == "o123").Value;

Linq方法First的定义:

First<TSource>(this IEnumerable<TSource>, Func<TSource, Boolean>)
  • 第一个参数是您正在使用的IEnumerable(Linq是扩展方法)
  • 第二个参数允许您设置将Func<TSource, Boolean>作为参数的过滤器,您可以将其定义为s => s.Key == "o123"

答案 1 :(得分:4)

告诉您的是Where是不必要的,并且代码可以表示为:

string custName = order.First(s => s.Key == "o123").Value;

原始代码的逻辑是这样的:

”浏览列表以查找所有匹配项,然后进行第一个匹配项

与更改后的代码相同:

“获得列表中的第一场比赛”

请注意,如果没有匹配项,此代码将引发异常。如果有可能没有匹配的客户,请改用FirstOrDefault

string custName;
var customer = order.FirstOrDefault(s => s.Key == "o123");

if (customer != null) {
   custName = customer.Value;
}
else {
    // code to handle no match
}