C# 获取有个人作为会员的俱乐部列表
我有一份俱乐部的名单。我需要LINQ声明方面的一些帮助,我知道此人的Id,并希望创建一个俱乐部列表,其中此人是俱乐部的成员 我的班级是这样的: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
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));