我有一份俱乐部名单。我需要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(???));
答案 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
执行比较,上述查询将有效,您也可以指定其他字段进行比较,或覆盖Equals
和GetHasCode
以直接比较对象
您可以覆盖Equals
和GetHashCode
,例如(来自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));