1

我有一个 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 查询中做到这一点?

4

3 回答 3

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

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

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

于 2013-07-18T12:37:36.047 回答
6

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

var attachedItems = items.ToDictionary(
      w => w.Number,
      w => w.Attachments.Select(a => string.IsNullOrEmpty(a.Name) 
                                     ? a.EquipmentCode : a.Name)
                        .ToArray());
于 2013-07-18T12:38:45.673 回答
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()
                     );
于 2013-07-18T12:38:37.667 回答