我写出了一个汇总的状态列表。它的工作正常,除了没有的情况。目前,呈现null并且位置为空。
item.Stuff.Where(e => Condition(e))
.Select(f => f.Status)
.Aggregate(String.Empty, (a, b) => a + b)
现在,我想用" --- "填充表格元素。如果通过条件将列表过滤为空列表,但我无法决定方法。
接近它的方法是什么?
我尝试过类似下面的暴行,但它看起来很好......非常糟糕,它也没有正确渲染。我会看到实际的源代码行(前面是 False 或 True )而不是值。
item.Stuff.Where(e => Condition(e)).Count() < 1
? "---"
: item.Stuff.Where(e => Condition(e))
.Select(f => f.Status)
.Aggregate(String.Empty, (a, b) => a + b)
答案 0 :(得分:4)
你可以这样做。如果状态列表相当小(否则应该使用 StringBuilder 而不是字符串连接)。
item.Stuff.Where(e => Condition(e))
.Select(f => f.Status)
.Aggregate("---", (a, b) => (a == "---") ? b : (a + b));
它检查是否替换了默认文本,如果是,则将下一个状态元素连接到已存在的文本块。
这将返回&#34; --- &#34;当且仅当它从未被评估时,即列表是否为空。否则,会得到与之前相同的结果。
如果Status
是枚举,并且您只需要不同的状态,则可以使用[Flags]属性的行为。
如果你定义这样的枚举
[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)
结果是列表中存在的所有状态的集合,如果它从未运行,则输出格式良好的列表(Active, Inactive, Pending
)或None
。
答案 1 :(得分:0)
您可以使用DefaultIfEmpty(string.Empty).First();
MSDN
实施例
var item = item.Stuff.Where(e => Condition(e))
.Select(f => f.Status)
.Aggregate(String.Empty, (a, b) => a + b);
var newitem = item.DefaultIfEmpty(new Item() { i = 1, Status = "---" }).First();