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

C# 如何在连接属性时将重复对象与Linq合并?,c#,.net,performance,linq,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

我有一个目标:

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>();

我将编写一个函数,将
用户
的集合合并为一个,并从查询中调用该函数:

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.
}
如果您不喜欢在
Merge
函数中有多个查询,请将其重新编写为
foreach
循环,或者使用您认为合适的任何构造


关键是在Linq查询之外获得一些有效的东西并定义“合并”规则,然后使其更好

我将编写一个函数,将
用户
的集合合并为一个,并从查询中调用该函数:

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.
}
如果您不喜欢在
Merge
函数中有多个查询,请将其重新编写为
foreach
循环,或者使用您认为合适的任何构造

关键是在Linq查询之外获得一些有效的东西并定义“合并”规则,然后使其更好

使用answer,我在在线编译器上运行了代码,并使用了一些mod。需要在合并函数中添加其他属性,如Stanley所说

用户列表(“A、B、C、D、E”是securityroles):

用户:

测试1A

测试1 B

测试2 C

测试2d

测试3 E

linq之后:

新用户:

测试1 A,B

测试2 C,D

测试3 E

使用answer,我在联机编译器上运行了代码,并使用了一些mod。需要在合并函数中添加其他属性,如Stanley所说

用户列表(“A、B、C、D、E”是securityroles):

用户:

测试1A

测试1 B

测试2 C

测试2d

测试3 E

linq之后:

新用户:

测试1 A,B

测试2 C,D

测试3 E


谢谢你,D斯坦利和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;
        }
    }

谢谢你,D斯坦利和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;
        }
    }

您将如何“合并”其他属性?只是连接所有的字符串属性?假设只有一个值?假设它们都是相同的?那么,如果有两个全名相同的人,您希望将每个人的securityroles连接在一起?其他领域呢,完全忽略?您想要组中的哪一个用户,只是第一个?@DStanley我正在合并对象。你也可以说我正在合并该对象的一个属性,只有一个!由于我是如何获得这些数据的,我知道没有两个全名相同的用户具有相同的securityroles属性。@maccettura任意使用第一个属性是可以的。您将如何“合并”其他属性?只是连接所有的字符串属性?假设只有一个值?假设它们都是相同的?那么,如果有两个全名相同的人,您希望将每个人的securityroles连接在一起?其他领域呢,完全忽略?您想要组中的哪一个用户,只是第一个?@DStanley我正在合并对象。你也可以说我正在合并该对象的一个属性,只有一个!由于我是如何获得这些数据的,我知道没有两个全名相同的用户具有相同的securityroles属性。@maccettura任意使用第一个属性是可以的。您的代码无法编译。“名为'u'的局部变量不能在此范围内声明,因为它将赋予'u'不同的含义,而'u'已在'parent or current'范围内用于表示其他内容”@MichaelDrum Well,也许重命名其中一个就可以了?@Timbo我应该意识到这一点。@Timbo我将第一个
u
重命名为
user
,以清除错误。@DStanley谢谢,我会把你的答案标记为正确的。干得好!您的代码无法编译。“名为'u'的局部变量不能在此范围内声明,因为它将赋予'u'不同的含义,而'u'已在'parent or current'范围内用于表示其他内容”@MichaelDrum Well,也许重命名其中一个就可以了?@Timbo我应该意识到这一点。@Timbo我将第一个
u
重命名为
user
,以清除错误。@DStanley谢谢,我会把你的答案标记为正确的。干得好!
users = (from user in users
         group user by user.fullname into g
         select Merge(g)
        ).ToList();