【问题标题】:Adding a default string if list empty如果列表为空,则添加默认字符串
【发布时间】:2014-04-14 09:14:07
【问题描述】:

我正在写一个汇总的状态列表。除了没有的情况外,它工作正常。目前渲染的是null,位置为空。

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

现在,我想用“---”填充表格元素,以防列表被 Condition 过滤为空列表,但我可以'不决定方法。

什么是处理它的顺利方法?

我已经尝试过类似下面的暴行,但它看起来,嗯......,很残暴,而且渲染也不正确。我看到的是实际的源代码行(前面是 FalseTrue)而不是值。

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)

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这将返回“---”当且仅当它从未被评估,即如果列表为空。否则会得到与以前相同的结果。


    如果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(如果它从未运行过)。

    【讨论】:

    • +½ 表示整洁,+½ 表示 StringBuilder 备注。该列表非常小,通常只有两个或三个元素,所以 plus-concat 就可以了。语法已经很长了。 :)
    • 您可以省略 Select 并在 Aggregate 调用中添加 b.Status 以减少字符数 :)
    • 如果可以的话,我会给你+1。好点子。可悲的是,我作弊了一点 - Status 是一个 enum 所以我必须使用 ToString 并将其添加到所有 a 和 b 会另外破坏代码。它会呈现类似 (a.Status.ToString(),b.Status.ToString()) 的东西,不是吗?不过,这是一个非常好的评论。
    • 我添加了一些如何处理枚举的建议
    • 非常棒的建议——我会马上提出来的,伙计。谢谢!如果我不是因为他们因涉嫌作弊而撤回 5000+ 分数而对我的声誉不那么偷偷摸摸,我会赏金你。 :)
    【解决方案2】:

    你可以使用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();
    

    【讨论】:

    • 我需要在一行中。我正在使用 Razor 将内容放在页面上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2014-04-25
    • 1970-01-01
    • 2014-02-07
    • 2013-05-27
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多