我有一个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的期望。
任何输入都非常有帮助。谢谢。
答案 0 :(得分:6)
使用First
lambda表达式可以分两个步骤进行操作
string custName = order.First(s => s.Key == "o123").Value;
Linq方法First
的定义:
First<TSource>(this IEnumerable<TSource>, Func<TSource, Boolean>)
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
}