如果列表为空,则添加默认字符串

时间:2014-04-14 09:14:08

标签: c# asp.net-mvc linq razor

我写出了一个汇总的状态列表。它的工作正常,除了没有的情况。目前,呈现null并且位置为空。

item.Stuff.Where(e => Condition(e))
  .Select(f => f.Status)
  .Aggregate(String.Empty, (a, b) => a + b)

现在,我想用" --- "填充表格元素。如果通过条件将列表过滤为空列表,但我无法决定方法。

接近它的方法是什么?

我尝试过类似下面的暴行,但它看起来很好......非常糟糕,它也没有正确渲染。我会看到实际的源代码行(前面是 False True )而不是值。

item.Stuff.Where(e => Condition(e)).Count() < 1
  ? "---"
  : item.Stuff.Where(e => Condition(e))
    .Select(f => f.Status)
    .Aggregate(String.Empty, (a, b) => a + b)

2 个答案:

答案 0 :(得分:4)

你可以这样做。如果状态列表相当小(否则应该使用 StringBuilder 而不是字符串连接)。

item.Stuff.Where(e => Condition(e))
    .Select(f => f.Status)
    .Aggregate("---", (a, b) => (a == "---") ? b : (a + b));

它检查是否替换了默认文本,如果是,则将下一个状态元素连接到已存在的文本块。

这将返回&#34; --- &#34;当且仅当它从未被评估时,即列表是否为空。否则,会得到与之前相同的结果。


如果Status是枚举,并且您只需要不同的状态,则可以使用[Flags]属性的行为。

如果你定义这样的枚举

[Flags]
enum Status
{
    None = 0,
    Active = 1,
    Inactive = 2,
    Pending = 4,
    Deleted = 8
    ...
}

你可以这样做:

item.Stuff.Where(e => Condition(e))
  .Aggregate(Status.None, (a, b) => a | b)

结果是列表中存在的所有状态的集合,如果它从未运行,则输出格式良好的列表(Active, Inactive, Pending)或None

答案 1 :(得分:0)

您可以使用DefaultIfEmpty(string.Empty).First(); MSDN

实施例

var item =  item.Stuff.Where(e => Condition(e))
  .Select(f => f.Status)
  .Aggregate(String.Empty, (a, b) => a + b);

var newitem = item.DefaultIfEmpty(new Item() { i = 1, Status = "---" }).First();