C#6.0和null

时间:2015-07-28 13:33:40

标签: c# null c#-6.0

尝试重构以下代码:

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不会为它添加任何新内容。正在思考“哦,太棒了,我们现在有?.?[]!应该很酷!”然后就像...嗯,但它不会经常发生右侧表达......

我错了吗?这段代码可以变得更漂亮了吗?

2 个答案:

答案 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。这将更适合代码审查网站