C# 在列表中合并重复项

C# 在列表中合并重复项,c#,list,linq,C#,List,Linq,在我当前的测试项目中,我希望将所有对象合并到一个列表中,其中一个对象的值与另一个对象中的值相同,然后我希望检查这些对象下的其他值,并将它们合并在一起,如下示例: Object1 { id = 111, price1 = 10, price 2 = 20 } Object2 { id = 222, price1 = 10, price 2 = 20 } Object3 { id = 111, price1 = 30, price 2 = 70 } Object4 { id = 444, pr

在我当前的测试项目中,我希望将所有对象合并到一个列表中,其中一个对象的值与另一个对象中的值相同,然后我希望检查这些对象下的其他值,并将它们合并在一起,如下示例:

Object1
{
id = 111,
price1 = 10,
price 2 = 20
}

Object2
{
id = 222,
price1 = 10,
price 2 = 20
}

Object3
{
id = 111,
price1 = 30,
price 2 = 70
}

Object4
{
id = 444,
price1 = 15,
price 2 = 25
}
根据上述Object1和Object3,将根据它们的相关“id”值进行组合,然后将它们的价格进行组合,并将导致以下对象替换列表中的Object1和Object3:

NewObject
{
id = 111,
price1 = 40,
price 2 = 90
}
最终列表将如下所示:

NewObject
{
id = 111,
price1 = 40,
price 2 = 90
}

Object2
{
id = 222,
price1 = 10,
price 2 = 20
}

Object4
{
id = 444,
price1 = 15,
price 2 = 25
}
到目前为止,我将使用linq获取值,如下所示:

  • 选择所有具有相同id的项并添加它们的值
  • 使用步骤1中获得的所有值的组合值创建新对象,并添加到新列表中
  • 在列表上继续,如果“id”已存在于新列表中,则忽略它,因为它已合并到新列表中
  • 是否有一种更快捷、更简单的方法可以使用单个LINQ语句?

    试试分组方式

    var result = source
    .GroupBy(x => x.id,
             (key, values) => new {
                id = key,
                price1 = values.Sum(x => x.price1),
                price2 = values.Sum(x => x.price2)
             });
    
    var combined = list.GroupBy(x => x.id, x => x).Select(x => new ListObj()
                {
                    id = x.Key,
                    price1 = x.Sum(s => s.price1),
                    price2 = x.Sum(s => s.price2),
                });
    
    整个控制台应用程序:

    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<ListObj>()
            {
                new ListObj()
                {
                    id = 111,
                    price1 = 10,
                    price2 = 20
                },
                new ListObj()
                {
                    id = 222,
                    price1 = 10,
                    price2 = 20
                },
                new ListObj()
                {
                    id = 111,
                    price1 = 30,
                    price2 = 70
                },
                new ListObj()
                {
                    id = 444,
                    price1 = 15,
                    price2 = 25
                },
            };
            var combined = list
                .GroupBy(x => x.id, x => x)
                .Select(x => new ListObj()
                {
                    id = x.Key,
                    price1 = x.Sum(s => s.price1),
                    price2 = x.Sum(s => s.price2),
                });
            Console.ReadKey();
        }
    }
    
    public class ListObj
    {
        public int id { get; set; }
        public int price1 { get; set; }
        public int price2 { get; set; }
    }
    
    类程序
    {
    静态void Main(字符串[]参数)
    {
    var list=新列表()
    {
    新ListObj()
    {
    id=111,
    价格1=10,
    价格2=20
    },
    新ListObj()
    {
    id=222,
    价格1=10,
    价格2=20
    },
    新ListObj()
    {
    id=111,
    价格1=30,
    价格2=70
    },
    新ListObj()
    {
    id=444,
    价格1=15,
    价格2=25
    },
    };
    var组合=列表
    .GroupBy(x=>x.id,x=>x)
    .Select(x=>newlistobj()
    {
    id=x.键,
    价格1=x.Sum(s=>s.price1),
    价格2=x.Sum(s=>s.price2),
    });
    Console.ReadKey();
    }
    }
    公共类ListObj
    {
    公共int id{get;set;}
    public int price1{get;set;}
    公共整数价格2{get;set;}
    }
    
    尝试分组方式

    var combined = list.GroupBy(x => x.id, x => x).Select(x => new ListObj()
                {
                    id = x.Key,
                    price1 = x.Sum(s => s.price1),
                    price2 = x.Sum(s => s.price2),
                });
    
    整个控制台应用程序:

    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<ListObj>()
            {
                new ListObj()
                {
                    id = 111,
                    price1 = 10,
                    price2 = 20
                },
                new ListObj()
                {
                    id = 222,
                    price1 = 10,
                    price2 = 20
                },
                new ListObj()
                {
                    id = 111,
                    price1 = 30,
                    price2 = 70
                },
                new ListObj()
                {
                    id = 444,
                    price1 = 15,
                    price2 = 25
                },
            };
            var combined = list
                .GroupBy(x => x.id, x => x)
                .Select(x => new ListObj()
                {
                    id = x.Key,
                    price1 = x.Sum(s => s.price1),
                    price2 = x.Sum(s => s.price2),
                });
            Console.ReadKey();
        }
    }
    
    public class ListObj
    {
        public int id { get; set; }
        public int price1 { get; set; }
        public int price2 { get; set; }
    }
    
    类程序
    {
    静态void Main(字符串[]参数)
    {
    var list=新列表()
    {
    新ListObj()
    {
    id=111,
    价格1=10,
    价格2=20
    },
    新ListObj()
    {
    id=222,
    价格1=10,
    价格2=20
    },
    新ListObj()
    {
    id=111,
    价格1=30,
    价格2=70
    },
    新ListObj()
    {
    id=444,
    价格1=15,
    价格2=25
    },
    };
    var组合=列表
    .GroupBy(x=>x.id,x=>x)
    .Select(x=>newlistobj()
    {
    id=x.键,
    价格1=x.Sum(s=>s.price1),
    价格2=x.Sum(s=>s.price2),
    });
    Console.ReadKey();
    }
    }
    公共类ListObj
    {
    公共int id{get;set;}
    public int price1{get;set;}
    公共整数价格2{get;set;}
    }
    
    您需要根据id进行分组。请参阅msdn示例:您需要根据id进行分组。请参阅msdn示例:好的解决方案,可能是一些解释性的句子有助于OP掌握其背后的思路。:)很好的解决办法,可能是用几个解释性的句子来帮助OP抓住它背后的思路。:)