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



我正在写一个状态的聚合列表。除了没有的情况外,它工作得很好。此时,将呈现null,并且该位置为空。

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

我有一个解决和改进的建议如下。

[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出现在以前有一个状态的地方。

也许我脑子太困了,但我不明白为什么。因此,我不该怎么办,也不…:(

如果状态来自扩展系统(即数据库),则可能还需要重新编号。

请注意,只有当您使用两个值的幂作为状态值时,这才有效。

例如。如果我使用

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

则CCD_ 1将返回CCD_ 2(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))

相关内容

  • 没有找到相关文章

最新更新