Linq-将每个班级分组 [英] Linq - group each class

查看:176
本文介绍了Linq-将每个班级分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要帮助来删除电子邮件地址列表中的重复项.我需要将代码添加到emailaddresses类中的emailaddresses分组.由于电话号码不同,Sql返回重复的电子邮件地址.有什么建议?谢谢.

I need help removing duplicates form the emailaddresses list. I need to add the code to group emailaddresses within the emailaddresses class. Sql is returning duplicate email addresses because of the different telephone numbers. Any suggestions? Thanks.

这是我的代码: 1.班级

public class Student
{
    public string StudentId { get; set; }
    public string Gender { get; set; }  
    public List<EmailAddresses> emailAddresses { get; set; }
}

public class EmailAddresses
{
    public string EmailAddress { get; set; }    
}

2.数据来自sql查询

StudentId   EmailAddresses  IsPreferred Number  TelephoneType                                                                                               
123456789   maryjoe@gmail.com   FALSE   5556565 Present Evening Phone                                                                                               
123456789   maryjoe@gmail.com   FALSE   8885566 Permanent Day Phone                                                                                             
123456789   mary.joe@cuu.edu    TRUE    5556565 Present Evening Phone                                                                                               
123456789   mary.joe@cuu.edu    TRUE    8885566 Permanent Day Phone                                                                                             
456789123   dh@mycollege.edu    TRUE    7513150 Business Day Phone                                                                                              
456789123   donna.hill@cu.edu   TRUE    4123300 Present Day Phone                                                                                               
456789123   donna.hill@cu.edu   FALSE   4123300 Present Day Phone

3.代码

public List<Student> GetStudentData()
{
    List<Student> dataStudent;
    using (IDbConnection connection = RepositoryHelper.OpenConnection())
    {
        dataStudent = connection.Query<dynamic>(
            "mystoredprocedure", 
            commandType: CommandType.StoredProcedure)
                .GroupBy(x => x.StudentId)
                .Select(x => new Student 
                    { 
                        StudentId = x.First().StudentId, 
                        Gender = x.First().Gender,
                        emailAddresses = x.Select(ea => new EmailAddresses 
                            { 
                                EmailAddress = ea.emailAddresses 
                            }).ToList()
                    }).ToList();

        return dataStudent;
    }
}

推荐答案

虽然最好在返回之前过滤掉重复项,但这也会增加代码的复杂性.如果结果集很小,则返回数据后进行过滤的内存和cpu开销可能很容易得到清楚的结果.您可以使用自定义IEqualityComparer检查不同的结果,并在每个包含不同电子邮件地址的学生记录上创建一个新的emailAddresses列表.

While it would be preferable to filter out duplicates before returning, it also increases the complexity of your code. If your result set is small, the memory and cpu overhead of filtering after you've returned the data may be suffer-able to easily and clearly get the results that you need. You can use a custom IEqualityComparer to check for distinct results and create a new emailAddresses list on each Student record that contains distinct email addresses.

public List<Student> GetStudentData()
{
    List<Student> dataStudent;
    using (IDbConnection connection = RepositoryHelper.OpenConnection())
    {
        dataStudent = connection.Query<dynamic>(
            "mystoredprocedure", 
            commandType: CommandType.StoredProcedure)
                .GroupBy(x => x.StudentId)
                .Select(x => new Student 
                    { 
                        StudentId = x.First().StudentId, 
                        Gender = x.First().Gender,
                        emailAddresses = x.Select(ea => new EmailAddresses 
                            { 
                                EmailAddress = ea.emailAddresses 
                            }).ToList()
                    }).ToList();

        dataStudent.ForEach(x => x.emailAddresses = x.emailAddresses
            .Distinct(new StudentEmailEqualityComparer()).ToList());

        return dataStudent;
    }
}

public class StudentEmailEqualityComparer : IEqualityComparer<EmailAddresses>
{

    public bool Equals(EmailAddresses x, EmailAddresses y)
    {
        return x.EmailAddress.Equals(y.EmailAddress);
    }

    public int GetHashCode(EmailAddresses obj)
    {
        return obj.EmailAddress.GetHashCode();
    }
}

这篇关于Linq-将每个班级分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆