我有一个对象:
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();
答案 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所说。
用户列表(&#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();