尝试重构以下代码:
var items = Common.Deserialize<DiagnosisItem[]>(path, false);
if (items != null)
foreach (var item in items)
{
var find = _items.Where(o => o.Value.Tooltip == item.Id).FirstOrDefault();
if (find.Value != null)
{
find.Value.Text = item.Text;
find.Value.Color = (Color)converter.ConvertFromInvariantString(item.Color);
}
}
谈论null
次检查。似乎C#
6.0不会为它添加任何新内容。正在思考“哦,太棒了,我们现在有?.
和?[]
!应该很酷!”然后就像...嗯,但它不会经常发生右侧表达......
我错了吗?这段代码可以变得更漂亮了吗?
答案 0 :(得分:4)
我通常喜欢尽可能多地放入查询中,因为查询比语句更易于组合。
var items = Common.Deserialize<DiagnosisItem[]>(path, false);
var updates =
from item in items.NullToEmpty()
join find in _items on o.Value.Tooltip equals item.Id
where find.Value != null
select new { find.Value, item };
foreach (var u in updates)
{
u.Value.Text = u.item.Text;
u.Value.Color = (Color)converter.ConvertFromInvariantString(u.item.Color);
}
在这里,我认为不需要新的null运算符。
作为一个很好的副作用,FirstOrDefault
事物的二次时间复杂度消失了。
答案 1 :(得分:2)
C#6的一方,我个人更喜欢以下方法,你可以反转你的if语句以减少箭头代码。
var items = Common.Deserialize<DiagnosisItem[]>(path, false);
if (items == null)
return;
foreach (var item in items)
{
var find = _items.Where(o => o.Value.Tooltip == item.Id).FirstOrDefault();
if (find.Value == null)
continue;
find.Value.Text = item.Text;
find.Value.Color = (Color)converter.ConvertFromInvariantString(item.Color);
}
P.S。这将更适合代码审查网站