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

C# 获取有个人作为会员的俱乐部列表,c#,.net,linq,C#,.net,Linq,我有一份俱乐部的名单。我需要LINQ声明方面的一些帮助,我知道此人的Id,并希望创建一个俱乐部列表,其中此人是俱乐部的成员 我的班级是这样的: public class Club { public Guid ClubId { get; set; } public string ClubName { get; set; } public List<ClubMember> Members { get; set; } } public class ClubMember

我有一份俱乐部的名单。我需要LINQ声明方面的一些帮助,我知道此人的Id,并希望创建一个俱乐部列表,其中此人是俱乐部的成员

我的班级是这样的:

public class Club
{
   public Guid ClubId { get; set; }
   public string ClubName { get; set; }
   public List<ClubMember> Members { get; set; }
}
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(???));

首先,您需要该语句来筛选匹配的俱乐部

然后,您将需要使用该语句来验证当前迭代的俱乐部是否包含该ID

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

var clubs = clubsList
    .Where(club => club.Members
        .Any(member => member.MemberId == yourID));
请注意,这将在^2上使用-要求您迭代每个俱乐部中的每个人。如果您经常进行此查询,您可能希望每个俱乐部都有一个字典,使用以下代码在*logn上进行查询:

var clubs = clubsList.Where(x => x.Members.ContainsKey(yourID));
这也使代码更易于阅读和维护。

您可以使用它

由于成员是列表,所以另一个选项是

使用:

如果希望对MemberId执行比较,则可以使用上述查询,也可以指定其他字段进行比较,或者重写Equals和GetHasCode以直接比较对象

您可以像resharper的快速帮助一样覆盖Equals和GetHashCode

然后你可以简单地做:

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

这是对对象的linq吗?它不是MemberId吗?需要==不分配=一个后续问题:我只想在我的新列表中选择ClubId和ClubName字段。我尝试了var clubs=clubsList.Whereclub=>club.Members.Anymember=>member.MemberId==yourID.Selecto=>newclub{o.clubbid,o.ClubName}.ToList;但是我一直收到一个错误,它说不能用集合初始值设定项初始化类型Club,因为它没有实现System.Collections.IEnumerablet这是因为你像构造函数一样使用初始值设定项,你需要声明属性名o=>new Club{ClubId=o.ClubId,ClubName=o.ClubName}
var clubs = clubsList.Where(x => x.Members.Exists(m => m.MemberId == someId));
var clubs = clubsList.Where(x => x.Members
                           .Any(member => member.MemberId == yourMember.MemberId);
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));