使用Linq和Lambda包括默认值

阿夫辛·加兹(Afshin Ghazi)

我有两个清单:relatedContactfileContactIds我正在使用该查询循环循环relatedContacts列表,并仅当它也在列表中时,返回userClientCode的值(我将使其成为图像名称)fileContactIds如果该值不在第二个列表中,该如何输入一个值(例如:“默认”)?

var result = relatedContact.SelectMany(rc => rc.contacts.Select(pc => new RelatedContactsDescription
                {
                    imageUrl = mappedRelatedContactsPath + pc.userclientcode + ".jpg",
                    userclientcode = pc.userclientcode,
                    description = rc.clienttaxonomy,
                    fullname = pc.fullname,
                    email = pc.contactdetails != null && pc.contactdetails.Count >= 1 ? pc.contactdetails[0].contactdata : "",
                    address = pc.contactdetails != null && pc.contactdetails.Count >= 2 ? pc.contactdetails[1].contactdata : "",
                    phoneNumber = pc.contactdetails != null && pc.contactdetails.Count >= 3 ? pc.contactdetails[2].contactdata : "",
                    populated = string.IsNullOrEmpty(pc.userclientcode) ||
                                string.IsNullOrEmpty(pc.fullname) ||
                                string.IsNullOrEmpty(pc.contactdetails[0].contactdata) ? false : true,
                }))
                .Where(el => fileContactIds.Contains(el.userclientcode)).ToList();

我读过:Lambdas和Linq以及Joins First或Default等,但是我所能看到的是如何从两者中获取匹配的数据,而不是如何在不匹配的情况下放置“后备”或默认值。

提前致谢

柬埔寨Mrinal

在您当前的代码中进行以下更改:

  • 取出Where条款,因为这不是服务宗旨,你需要Default在那里UserClientCode不存在,你不想使用它们过滤掉Where

  • 更改SelectMany通话中的以下内容

    userclientcode = pc.userclientcode

 userclientcode = fileContactIds.Contains(pc.userclientcode) ? 
                  pc.userclientcode : "Default"

您可以考虑使用使用Left Join创建一个扁平化列表帖子SelectMany,但这将是一种实现方法的回合方式,这是在创建扁平化列表时简单实现的方法。

使用左联接

以下是“左联接”的代码选项,它GroupJoin在C#中需要

var result = relatedContact.SelectMany(rc => rc.contacts.Select(pc => {pc})
                           .GroupJoin(fileContactIds, pc => pc.userclientcode,
                                      fc => fc.ContactId,new {pc,fc})
                           .SelectMany(
                            x => x.fc.DefaultIfEmpty()
                            (x,y) => new RelatedContactsDescription
                            {
                               userclientcode = (y == null) ? "Default":x.pc.userclientcode,
                            .........(fill remaining as per original logic)
                            });

它是如何工作的

  • 通过relatedContact使用创建匿名列表SelectMany
  • GroupJoin与fileContactIds。我假设字段是ContactId
  • 使用来自两个集合的数据创建一个匿名列表,其中来自fileContactIds的不匹配记录将为空 LeftJoin
  • 在最后的SelectMany明确声明中,将fileContactIds空值设置为null,然后在数据选择期间将其设置为空值,因此,我之前建议的null值应填写“ Default”,否则为特定值

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章