获取有人作为会员的俱乐部列表

时间:2016-01-28 19:18:53

标签: c# .net linq

我有一份俱乐部名单。我需要LINQ声明中的一些帮助,我知道该人的身份证,并希望创建一个此特定人员所在的俱乐部列表。

我的class看起来像这样:

public class Club
{
   public Guid ClubId { get; set; }
   public string ClubName { get; set; }
   public List<ClubMember> Members { get; set; }
}

ClubMember class看起来像这样:

public class ClubMember
{
   public Guid MemberId { get; set; }
   public string FullName { get; set; }
   public DateTime MemberSince { get; set; }
}

这是我遇到的LINQ查询:

var clubs = clubsList.Where(x => x.Members.Contains(???));

3 个答案:

答案 0 :(得分:4)

首先,您需要{strong> 过滤Where语句才能匹配俱乐部。

如果ID ,您需要使用Any语句 验证 >由目前重复的俱乐部。

假设yourID是您要查找的ID,以下查询应该可以完成这项工作:

var clubs = clubsList
    .Where(club => club.Members
        .Any(member => member.MemberId == yourID));

请注意,这适用于 O(n ^ 2) - 要求您在每个俱乐部中 每个人进行迭代 < / strong>即可。如果您经常进行此查询,则可能需要 在每个俱乐部中设置Dictionary<Guid, ClubMember> ,从而使您的查询 O(n * log(n)) 而不是使用以下代码:

var clubs = clubsList.Where(x => x.Members.ContainsKey(yourID));

这也使代码更易于阅读和维护。

答案 1 :(得分:2)

使用:

var clubs = clubsList.Where(x => x.Members
                           .Any(member => member.MemberId == yourMember.MemberId);

如果您希望对MemberId执行比较,上述查询将有效,您也可以指定其他字段进行比较,或覆盖EqualsGetHasCode以直接比较对象

您可以覆盖EqualsGetHashCode,例如(来自resharper的快速帮助)

public class ClubMember 
{
    protected bool Equals(ClubMember other)
    {
        return MemberId.Equals(other.MemberId) && string.Equals(FullName, other.FullName) && MemberSince.Equals(other.MemberSince);
    }

    public Guid MemberId { get; set; }
    public string FullName { get; set; }
    public DateTime MemberSince { get; set; }
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((ClubMember) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = MemberId.GetHashCode();
            hashCode = (hashCode*397) ^ (FullName != null ? FullName.GetHashCode() : 0);
            hashCode = (hashCode*397) ^ MemberSince.GetHashCode();
            return hashCode;
        }
    }
}

然后你就可以做到:

ClubMember yourMember = new ClubMember(); //Some member to be searched
var clubs = clubsList.Where(x => x.Members.Contains(yourMember));

答案 2 :(得分:1)

您可以{/ 3}}使用

var clubs = clubsList.Where(x => x.Members.Any(m => m.MemberId == someId));

Members之后的另一个选项List<ClubMember>Any

var clubs = clubsList.Where(x => x.Members.Exists(m => m.MemberId == someId));