Linq查询从列表列表中获取对象

时间:2013-12-19 15:59:10

标签: c# linq list collections lambda

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

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

所以,看起来像是

Class AccountContacts
{
  List<ContactInfo> Contacts;
}

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

现在如果我有一个AccountContacts对象(ac),我怎样才能获得一个Contact对象,其中ContactInfo中的ContactType列表包含一个特定的字符串。

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

我试过这样的事情。

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

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

3 个答案:

答案 0 :(得分:4)

您的代码:

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

  • 当您拨打NullReferenceException时,这会导致.UserContact,因为您无法null.UserContact


更安全 - 检查null

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

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

  • 然后FirstOrDefault将获取第一条记录或返回null

答案 1 :(得分:1)

ac.Contacts
    .Where(x => x.ContactType.Contains("string"))
    .Select(x => x.UserContact)

这将返回具有“string”作为ContactType的联系人列表。

答案 2 :(得分:1)

如果他们保证不同:

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