我写出了一个汇总的状态列表。它的工作正常,除了没有的情况。目前,呈现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 出现在以前只有一个状态的地方。
也许我太困难了,但我不明白为什么。因此,不是我应该怎么做,也不是...... :(
答案 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))