【问题标题】:Linq query to get an object from list of listsLinq 查询从列表列表中获取对象
【发布时间】:2014-01-08 06:50:39
【问题描述】:

我有一个 AccountContacts 类,它包含一个数据成员联系人,它是一个 ContactInfo 类型的列表。

每个 ContactInfo 类都有两个成员。 1. 包含 ContactTypes(字符串)的列表 2. 联系人对象。

原来如此

Class AccountContacts
{
  List<ContactInfo> Contacts;
}

Class ContactInfo
{
   List<string> ContactType;
   Contact UserContact;
}

现在如果我有一个 AccountContacts 对象 (ac),我如何获取 ContactInfo 中的 ContactType 列表包含特定字符串的联系人对象。

顺便说一下,每个 ContactType 列表都是不同的。所以一次就可以返回Contact对象。

我尝试过这样的事情。

Contact myContact = ac.Contacts.Find(c => c.ContactType.Contains("specificString")).UserContact;

我能够获得 myContact。只是想知道有没有更好的方法呢?

【问题讨论】:

  • 你的电话看起来不错,是不是有问题,不能比一个班轮更好。

标签: c# linq list collections lambda


【解决方案1】:

您的代码:

  • 您正在使用Find method,如果与您的条件不匹配,则将产生null 结果,即没有ContactType 匹配您的输入。

  • 当你调用.UserContact 时,这将导致NullReferenceException,因为你不能调用null.UserContact


更安全 - 检查 null:

var contact = (ac.Contacts.Where(c => c.ContactType.Contains("specificString")).Select(c => c.UserContact)).FirstOrDefault();
  • 这使用Contains method 来确定列表是否包含您要查找的字符串。

  • 如果找到匹配项,则将选择 Contact

  • 那么FirstOrDefault 将获取第一条记录或返回null

【讨论】:

    【解决方案2】:

    如果保证它们是不同的:

    var contact = ac.Contacts.SingleOrDefault(c => c.ContractType.Contains("string"));
    if (contact != null)
    {
        var userContact = contact.UserContact;
    }
    else
    {
        // handle not found situation
    }
    

    【讨论】:

    • 如果结果是 null 并且您尝试访问 .UserContact,这不会导致 NullReferenceException 吗?
    • 当然会。编辑以提供帮助。
    • 就像一个注释我会避免使用 SingleOrDefault 没有充分的理由,因为它必须枚举整个集合以确保它是不同的。 FirstOrDefault 的性能更高,因为它一有结果就会停止尝试查找结果。在集合中强制唯一性应该在插入/更新时而不是在枚举集合时。 See here。只分享这个想法,因为我用了一段时间才意识到FirstOrDefault的好处。
    【解决方案3】:
    ac.Contacts
        .Where(x => x.ContactType.Contains("string"))
        .Select(x => x.UserContact)
    

    这将返回以“字符串”为 ContactType 的联系人列表。

    【讨论】:

    • Scott,这将返回 List&lt;Contact&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多