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