如何在连接属性时将重复对象与Linq合并?

时间:2017-07-06 20:46:27

标签: c# .net performance linq

我有一个对象:

private class User
    {
        public string fullname { get; set; }
        public string manager { get; set; }
        public string businessunit { get; set; }
        public string employeeid { get; set; }
        public string mainphone { get; set; }
        public string fax { get; set; }
        public string mobile { get; set; }
        public string email { get; set; }
        public string street3 { get; set; }
        public string street2 { get; set; }
        public string street1 { get; set; }
        public string city { get; set; }
        public string stateorprovince { get; set; }
        public string ziporpostalcode { get; set; }
        public string department { get; set; }
        public string countryorregion { get; set; }
        public string salesarea { get; set; }
        public string title { get; set; }
        public string username { get; set; }
        public string companyname { get; set; }
        public string securityroles { get; set; }
        public User()
        {

        }
    }

我还有一个该对象的列表:

List<User> users = new List<User>();

我想要做的是将列表中的所有用户与相同的 fullname 合并,同时将所有不同的 securityroles 连接到相同的 securityroles property。

我正在思考一些有用的方法:

users = (from user in users
                 group user by user.fullname
                 /*not sure what to put here*/).ToList();

3 个答案:

答案 0 :(得分:3)

我会编写一个函数,将User的集合合并为一个并从您的查询中调用它:

private User Merge(IEnumerable<User> users)
{
    User user = new User();

    if(!users.Any()) return user; // or null, whatever you think is appropriate

    user.fullname = users.First().fullname;
    user.securityroles = string.Join(", ", users.Select(u => u.securityroles));
    // similar rules/queries for other properties.
}

然后从主查询中调用它:

users = (from user in users
         group user by user.fullname into g
         select Merge(g)
        ).ToList();

如果您不喜欢在Merge函数中有多个查询,请将其重新编写为foreach循环,或使用您认为合适的任何构造。

重点是获取工作的内容,并在Linq查询之外定义“合并”规则,然后使其更好

答案 1 :(得分:1)

使用D Stanley答案,我运行了在线编译器上的代码,并带有一些mod。需要在合并功能中添加其他属性,如Stanley所说。

http://rextester.com/YJV50083

用户列表(&#39; A,B,C,D,E&#39;是安全措施):

  

用户:

     

Test1 A

     

Test1 B

     

Test2 C

     

Test2 D

     

Test3 E

在linq之后:

  

新用户:

     

Test1 A,B

     

Test2 C,D

     

Test3 E

答案 2 :(得分:0)

谢谢D Stanley和mzaverez。此函数可以工作,但我可能会更改它,因为合并函数执行多个查询:

private User Merge(IEnumerable<User> users)
    {
        User u = new User();
        if (!users.Any())
        {
            return u;
        }
        else
        {
            u.fullname = users.First().fullname;
            u.manager = users.First().manager;
            u.businessunit = users.First().businessunit;
            u.employeeid = users.First().employeeid;
            u.mainphone = users.First().mainphone;
            u.fax = users.First().fax;
            u.mobile = users.First().mobile;
            u.email = users.First().email;
            u.street1 = users.First().street1;
            u.street2 = users.First().street2;
            u.street3 = users.First().street3;
            u.city = users.First().city;
            u.stateorprovince = users.First().stateorprovince;
            u.ziporpostalcode = users.First().ziporpostalcode;
            u.department = users.First().department;
            u.countryorregion = users.First().countryorregion;
            u.salesarea = users.First().salesarea;
            u.title = users.First().title;
            u.username = users.First().username;
            u.companyname = users.First().companyname;
            u.securityroles = string.Join(", ", users.Select(x => x.securityroles));
            return u;
        }
    }

该功能由以下建议的非常有用的Linq代码调用:

users = (from user in users
         group user by user.fullname into g
         select Merge(g)
        ).ToList();