准备默认新行作为空值的替换

时间:2014-09-12 16:40:00

标签: c# linq

我正在使用rdlc进行报告,其中报告页脚位置需要保持在底部,但四个页脚可见性取决于特定条件。

为此我使用Union并使用Take(4)来确定是否有任何表格页脚不可见,它应该替换为底部的\r\n

应该是:

12345
\r\n
\r\n
\r\n

不喜欢这样:

\r\n
\r\n
\r\n
12345

这是我的代码。

var footerValues = new[]
{
    salesOrder.Subtotal.ToString("N0"),
    salesOrder.Discount.ToString("N0"),
    salesOrder.PPN.ToString("N0"),
    salesOrder.Total.ToString("N0")
};
var stats = new[] { 
    salesOrder.Discount >= 1 || salesOrder.PPN >= 1, // combined visibility
    salesOrder.Discount >= 1,  // visible only if the value >= 1
    salesOrder.PPN >= 1, // visible only if the value >= 1
    true // total always visible
};
var textValues = stats
    .Select((v, i) => v ? footerValues[i] : null).OfType<string>()
    .Union(Enumerable.Range(0, 4).Select(x => string.Empty).ToArray())
    .Take(4)
    .ToArray()
var footerValue = string.Join(Environment.NewLine, textValues);

如果统计数据产生

false, false, false, true

预期的footerValue将是

"12345\r\n\r\n\r\n\r\n"

但实际结果是

"12345\r\n"

代码有什么问题?或者可以简化吗?

1 个答案:

答案 0 :(得分:2)

这部分:

.Union(Enumerable.Range(0, 4).Select(x => string.Empty).ToArray()) 

毫无意义。它只返回一个string.Empty。因为Union删除了重复项。我认为您需要Concat代替。但是,您也可以将Enumerable.Range替换为Enumerable.Repeat

var textValues = stats
.Select((v, i) => v ? footerValues[i] : null).OfType<string>()
.Concat(Enumerable.Repeat(string.Empty, 4))
.Take(4)
.ToArray();