我正在写一个状态的聚合列表。除了没有的情况外,它工作得很好。此时,将呈现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))