2016-01-28 17 views
0

我有一个俱乐部的列表。我需要一些关于LINQ声明的帮助,我知道这个人的ID,并且想创建一个这个特定人员所属俱乐部的名单。获取有一个人作为会员的俱乐部的列表

class看起来是这样的:

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

而且ClubMemberclass看起来是这样的:

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

这是LINQ的对象? –

+0

它不会是'MemberId'吗? –

回答

4

第一所有你需要的Where s为过滤器为配套俱乐部。

比你需要使用Any语句验证如果ID 包含由当前迭代俱乐部。

假设yourID是你正在寻找的ID,下面的查询应该做的工作:

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

注意,这将与为O(n^2)工作 - 需要你遍历每个俱乐部的每个人。如果你这样做查询了很多,你可能想已在各个俱乐部,而不是一个Dictionary<Guid, ClubMember>,使您的查询O(N *的log(n)),而不是使用下面的代码:

​​

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

+0

如果只有所有答案都是这样的... –

+0

后续问题:我想在我的新列表中只选择ClubId和ClubName字段。我试过var clubs = clubsList 。Where(club => club.Members 。Any(member => member.MemberId == yourID))。Select(o => new Club {o.ClubId,o.ClubName})。 ToList();但我不断收到一个错误,说:“不能初始化类型俱乐部与集合初始值设定项,因为它没有实现System.Collections.IEnumerable – Sam

+0

这是因为你正在使用构造函数的初始值设定项,你需要声明propery名称o = >新俱乐部(){ClubId = o.ClubId,ClubName = o.ClubName}' –

1

因为Members您可以使用Any

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

另一个选项是List<ClubMember>Exists

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

需要'=='不分配'=' –

+0

@MarkC是的,修正了 – juharr

+0

这不是我的倒退 –

2

用途:

var clubs = clubsList.Where(x => x.Members 
          .Any(member => member.MemberId == yourMember.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)); 
相关问题