使用linq可以使其更具可读性吗?

时间:2010-07-05 12:44:29

标签: c# linq

我正在尝试使用linq,它使我的代码可读 - foreach循环通常是简单的目标。

然而,有一个似乎很简单,但是linq形式让我感到厌烦:

const byte EscapeByte = 0x5C;

List<byte> result = new List<byte>();
foreach (var v in values)
{
    if (v.Escaped)
    {
        result.Add(EscapeByte);
    }
    result.Add(v.DataByte);
}
return result.ToArray();

这可能意味着它最好独自一人..但我很好奇,如果一位老将能够以可读的方式解决它?

4 个答案:

答案 0 :(得分:7)

return values.SelectMany(v => v.Escaped ? new[] { EscapeByte, v.DataByte } : new[] { v.DataByte }).ToArray();

或者:

return (from v in values
        from r in v.Escaped ? new[] { EscapeByte, v.DataByte } : new[] { v.DataByte }
        select r).ToArray()

答案 1 :(得分:3)

虽然上面的答案可能是正确的并且表明对LINQ的理解,但我认为它们都没有使代码更具可读性。功能方法并不总是更好。

当数据未发生变异时,功能方法最佳,因为这是数学函数的工作方式。这就是LINQ可以选择但不能插入或更新的原因。您的代码插入,这可能就是为什么它在LINQ-ified时看起来不太好。当然,您可能会发现LINQ代码更具可读性,因为可读性的感知因人而异。

答案 2 :(得分:0)

return values.Select(v => v.Escaped ? EscapeByte : v.DataByte).ToArray();

答案 3 :(得分:0)

在这里 - 替代解决方案:)

    return values.Aggregate(new List<byte>(), (agg,v) =>
        {
            if(v.Escaped) agg.Add(EscapedByte);
            agg.Add(v.DataByte);
            return agg;
        }, agg => agg.ToArray());