使用LINQ选择唯一成员

时间:2016-02-04 23:36:00

标签: c# linq

我有一个俱乐部列表,其中包含会员资产列表。如何获得唯一成员列表?

这就是为什么这个问题与你所建议的重复不同的原因: 这与示例有点不同,因为我的类的一个属性是另一个类 - 不是简单的int或字符串。

我的班级看起来像这样:

public class Club
{
   public int Id { get; set; }
   public string ClubName { get; set; }
   public List<Member> Members { get; set; }
}

成员类看起来像这样:

public class Member
{
   public Guid Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public DateTime MemberSince { get; set; }
}

再说明一点......

var myClubs = new List<Club>();
myClubs = getSomeData();

var uniqueMembers = myClubs.Select()...

3 个答案:

答案 0 :(得分:2)

这是一种方法:

docker-machine

根据评论,如果成员具有相同的docker-machine,则成员是平等的。

因此,首先您使用docker-machine stop default选择所有俱乐部的所有成员,然后按var result = myClubs .SelectMany(x => x.Members) .GroupBy(x => x.Id) .Select(x => x.First()) .ToList(); 对其进行分组。

现在每个组只包含同一成员的多个实例(如果没有此类成员的重复,则只包含一个成员)。

然后,您只需选择每个组的第一个成员即可获得唯一成员。

答案 1 :(得分:0)

这有效:

List<Member> distinctMembers =
    myClubs
        .SelectMany(c => c.Members)
        .GroupBy(m => m.Id)
        .SelectMany(m => m.Take(1))
        .ToList();

答案 2 :(得分:-1)

覆盖GetHashCode和Equals方法。

public class Member
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime MemberSince { get; set; }

    public override int GetHashCode()
    {
        // if each member has a unique Id assigned to him/her
        // you can simply return Id
        return Id.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        var member = (Member)obj;
        return member == null
            ? false
            : Id == member.Id;
    }
}

然后,要获得每个俱乐部的唯一成员列表,您可以致电:

var uniqueMembersForEachClub = myClubs.Select(c => c.Members.Distinct());

要获得所有俱乐部的独特会员列表,您可以致电:

var uniqueMembers = myClubs.SelectMany(c => c.Members).Distinct();

您需要包含:

using System.Linq;
祝你好运!