如果不是空的话,从财产中获取价值,否则获得Linq的其他财产

时间:2013-07-18 12:36:12

标签: c# linq

我有一个Linq查询,我可以从这样的对象中获取数据:

var attachedItems = items.ToDictionary(
                               w => w.Number,
                               w => w.Attachments.Select(a => a.Name).ToArray()
                    );

到目前为止,此工作正常,但有时Attachments.Name属性为空。然后我想得到另一个房产的价值。

举例说明:

var attachedItems = items.ToDictionary(
                               w => w.Number,
                               w => w.Attachments.Select(a => a.Name).ToArray()
                               // If Attachments.Name == Empty, then get
                               w => w.EquipmentCode
                    );

如何在Linq查询中执行此操作?

3 个答案:

答案 0 :(得分:6)

var attachedItems = items.ToDictionary(
       w => w.Number,
       w => w.Attachments.Select(a => a.Name)
                         .DefaultIfEmpty(w.EquipmentCode)
                         .ToArray()
                );

这将检索所有附件名称,如果没有附件,则返回包含EquipmentCode值的单个项目的数组。

如果在EquipmentCode上定义了Attachment属性,并且您需要将其作为每个附件的后备值,请检查Jon Skeet的答案。

答案 1 :(得分:6)

听起来你只想要条件运算符:

var attachedItems = items.ToDictionary(
      w => w.Number,
      w => w.Attachments.Select(a => string.IsNullOrEmpty(a.Name) 
                                     ? a.EquipmentCode : a.Name)
                        .ToArray());

答案 2 :(得分:1)

您可以使您的Select语句使用lambda并手动检查属性,如下所示:

var attachedItems = items.ToDictionary(
                               w => w.Number,
                               w => w.Attachments.Select(a => {
                                 if(String.IsNullOrEmpty(a.Name) == false) 
                                    return a.Name; 

                                  return a.EquipmentCode;
                              }).ToArray()
                     );