列出集合中所有实体的字段

时间:2014-04-14 13:38:53

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

我写出了一个汇总的状态列表。它的工作正常,除了没有的情况。目前,呈现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)

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

也许我太困难了,但我不明白为什么。因此,不是我应该怎么做,也不是...... :(

1 个答案:

答案 0 :(得分:2)

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

请注意,仅当您使用二次幂值作为状态值时,此方法才有效。

EG。如果我使用

[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 Active,5 Pending”或空字符串。


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

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