我正在尝试使用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();
这可能意味着它最好独自一人..但我很好奇,如果一位老将能够以可读的方式解决它?
答案 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());