C# 组合列表中重复项的特性值
我很好奇,如何最好地将重复记录中的属性合并到一个列表中。例如:C# 组合列表中重复项的特性值,c#,.net,linq,C#,.net,Linq,我很好奇,如何最好地将重复记录中的属性合并到一个列表中。例如: var res = new List<MyObjList> { new MyObj { Id = 1, Type = "Class", Current = "Math", New = "Science" }, new MyObj { Id = 2, Type = "Class", Current = "Math
var res = new List<MyObjList> {
new MyObj { Id = 1, Type = "Class", Current = "Math", New = "Science" },
new MyObj { Id = 2, Type = "Class", Current = "Math", New = "Science" },
new MyObj { Id = 1, Type = "Year", Current = "Freshman", New = "Sophomore" },
new MyObj { Id = 3, Type = "Year", Current = "Junior", New = "Senior" }
}
我不太明白的是如何按ID连接重复项,并使用条件属性值创建一个新对象(或组合每个重复项的属性)
编辑:更新的结果类型/对象
Edit2:已更新失败的尝试
谢谢 假设你有一个
Person
类,它有两个属性: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();
那么
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, 'Math', ''
3, '', 'Senior'
那么您想要json格式的结果?如果是这样,请特别将其添加到问题中,最好使用新对象。使用新输出示例更新问题您的问题太广泛。做些调查。试试看。你可能会想从LINQ的
groupby
语法开始。我认为不值得添加失败的尝试,但我已经做了研究。我添加了一个有助于找到解决方案的尝试示例。您有两个Id=1
的对象。但是它们在类型
和当前属性中有不同的值。因此,您希望从一个对象获取类
,从另一个对象获取当前
。感谢您的回复。是的,我对GroupBy很熟悉,让我感到不舒服的是,如果两个不同的属性有值,就将它们组合成一个对象。例如,假设第二个人对象有一个中间名,我希望结果是FirstName/LastName(如果LastName存在)和FirstName/MiddleName(如果MiddleName存在)的组合@Josh如果我误解了你,请告诉我:假设在本例中,Person
类中有另一个属性,名为MiddleName
,我们还有一个Id
,这两个人的Id是相同的(因此它们是重复的,应该组合在一起),列表中的第二个人有一个MiddleName
,但第一个人没有,如果到目前为止情况是正确的,那么您希望最终列表有什么?一个人,第一个人的名字和姓氏,第二个人的中间名?要准确地理解你的情景有点困难。是的,这正是我需要的,而且现在更有意义了。谢谢
List<Person> people = new List<Person> {
new Person
{
FirstName = "Arad",
LastName = "Aral"
}
};
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, 'Math', ''
3, '', 'Senior'