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'