gpt4 book ai didi

c# - 使用 Linq 和 Lambda 包含默认值

转载 作者:行者123 更新时间:2023-11-30 21:44:53 24 4
gpt4 key购买 nike

我有两个列表: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 and LinqJoins First or Default等等,但我所看到的只是如何从两者中获取匹配数据,而不是如何在它们不匹配时设置“回退”或默认值。

提前致谢

最佳答案

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

  • 删除 Where 子句,因为它没有达到目的,您需要 Default,其中 UserClientCode 不存在,您不想使用 Where

  • 过滤掉它们
  • SelectMany 调用中更改以下内容:

    userclientcode = pc.userclientcode

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

您可能会考虑使用 Left Join post 创建一个使用 SelectMany 的扁平化列表,但这将是一种实现它的循环方式,这只是在创建时实现扁平化列表。

使用左连接

下面是Left Join的代码选项,它需要C#中的GroupJoin:

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)
});

它是如何工作的

  • 使用 SelectManyrelatedContact 创建匿名列表
  • GroupJoin 与 fileContactIds。我假设字段是 ContactId
  • 使用来自两个集合的数据创建一个匿名列表,其中来自 fileContactIds 的不匹配记录将为空 LeftJoin
  • 在最后的 SelectMany 中明确使 fileContactIds 为空值,然后在数据选择期间,所以我之前建议的空值,填充“默认值”,否则为特定值

关于c# - 使用 Linq 和 Lambda 包含默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com