【问题标题】:Listing a field from all the entities in a collection列出集合中所有实体的字段
【发布时间】:2014-04-14 13:38:53
【问题描述】:

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

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

我有a suggestion for solution and improvement 如下。

[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.Status)

因为我非常喜欢更简单的语法,所以我喜欢跳过 Select 部分。但是,现在的结果并不是列出的所有元素。事实上,只列出了一个(而不是之前的五个),并且 None 出现在之前有一个状态的地方。

也许是我太脑残了,但我不明白为什么。因此,这不是我应该做的,也不是...... :(

【问题讨论】:

  • 状态来自哪里?如果它们来自外部系统(即数据库),您可能还需要重新编号那里的状态。
  • 把它作为一个回复,这样我就可以检查它作为一个答案。神一样的,伙计。我刚刚意识到状态应该被多次列出,所以 a | a 需要导致 aa 不仅仅是 a 但没关系。它仍然是上帝般的完成。

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


【解决方案1】:

如果状态来自外部系统(即数据库),您可能还需要重新编号那里的状态。

请注意,这仅在您使用 2 的幂值作为状态值时才有效。

例如。如果我使用

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

然后Status.Active | Status.Inactive 将返回Status.Pending (1+2=3)。

此外,这样您只能获得不同已使用状态的列表,即,如果您有 10 个活动项目和 5 个待处理项目,您将获得Active, Pending 结果,没有任何频率信息.

如果您也需要这些信息,我建议您进行一些分组,例如:

string.Join(", ", item.Stuff.Where(e => Condition(e))
  .Select(f => f.Status)
  .GroupBy(status => status)
  .Select(group => string.Format("{0} {1}", group.Count(), group.Key));

如果没有组,这将导致“10 个活动,5 个待处理”或一个空字符串。


编辑:现在我想起来了,string.Join 也可能是对原始问题的更好解决方案(IEnumerable.Aggregate 是一个很好的方法,但它可能有点矫枉过正)。就像这样:

string.Join(", ", item.Stuff.Where(e => Condition(e)).Select(f => f.Status))

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 2015-09-19
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多