如何解决合并列表中重复项的属性值
我对组合列表中重复记录的属性的最佳方法感到好奇。例如:
var res = new List<MyObjList> {
new MyObj { Id = 1,Type = "Class",Current = "Math",New = "Science" },new MyObj { Id = 2,new MyObj { Id = 1,Type = "Year",Current = "Freshman",New = "Sophomore" },new MyObj { Id = 3,Current = "Junior",New = "Senior" }
}
我正在寻找这个结果:
var res = new List<NewObj> {
new NewObj { Id = 1,Class = "Math",UpcomingYear = "Freshman" },new NewObj { Id = 2,UpcomingYear = null },new NewObj { Id = 3,Class = null,UpcomingYear = "Senior" }
}
尝试失败:
var newRes = res
.GroupBy(x => x.Id)
.Select(grp => new NewObj {
ItemId = grp.Key.Id,Class = grp.Key.Type == "Class" ? grp.Key.Class : null,UpcomingYear = grp.Key.Type == "Year" ? grp.Key.UpcomingYear : null
});
我不太了解的是如何通过ID连接重复项并创建具有条件属性值的新对象(或合并每个重复项的属性)。
编辑:更新了结果类型/对象
Edit2:更新后尝试失败
谢谢!
解决方法
怎么样...
const string ClassType = "Class";
const string YearType = "Year";
var newRes = res
.Where(r => r.Type == ClassType)
.Select(r => new
{
r.Id,Class = r.Current,UpcomingYear = res
.Where(r2 => r2.Id == r.Id && r2.Type == YearType)
.Select(r2 => r2.Current)
.FirstOrDefault()
})
.Union(res
.Where(r =>
r.Type != ClassType &&
!res.Any(r2 => r2.Id == r.Id && r2.Type == ClassType))
.Select(r => new
{
r.Id,Class = default(string),UpcomingYear = r.New
}));
foreach(var item in newRes)
{
Console.WriteLine($"{item.Id},'{item.Class}','{item.UpcomingYear}'");
}
输出:
1,'Math','Freshman'
2,''
3,'','Senior'
,
假设您有一个Person
类,该类具有2个属性:FirstName
和LastName
。
您有一个人员列表,您想要合并FirstName
和LastName
相同的人员(即删除重复项)。
您可以使用LINQ的GroupBy
方法,如以下示例所示:
List<Person> people = new List<Person> {
new Person
{
FirstName = "Arad",LastName = "Aral"
},new Person
{
FirstName = "Arad",LastName = "Aral"
}
};
List<Person> duplicatesRemoved = people.GroupBy(p => p.FirstName + p.LastName).Select(g => g.First()).ToList();
现在,我们的新列表duplicatesRemoved
如下:
List<Person> people = new List<Person> {
new Person
{
FirstName = "Arad",LastName = "Aral"
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。