C# объединить несколько ObjectList в один - PullRequest
0 голосов
/ 14 января 2020

У меня есть список объектов, подобный этому:

using System;
using System.Collections.Generic;
using System.Linq;

public class Item
{
    public int Id;
    public int Price;
}

public class Program
{
    public static void Main()
    {
        List<Item> food = new List<Item> {
            new Item { Id = 1, Price = 1},
            new Item { Id = 2, Price = 3},
            new Item { Id = 4, Price = 9}
        };

        List<Item> drinks = new List<Item> {
            new Item { Id = 1, Price = 1},
            new Item { Id = 2, Price = 2},
            new Item { Id = 3, Price = 0},
            new Item { Id = 4, Price = 1},
            new Item { Id = 6, Price = 1}
        };

        List<Item> magazines = new List<Item> {
            new Item { Id = 3, Price = 1},
            new Item { Id = 5, Price = 2},
        };

        var combined = food.Union(drinks).Union(magazines).Distinct().ToList();
    }
}

Я хочу добавить все цены в один список. Без каких-либо дубликатов (Id). Моя цель - получить общую сумму цен. Поэтому, в основном, сложите все цены для одного и того же идентификатора вместе.

Таким образом, объединенный список должен выглядеть следующим образом:

List<Item> combined = new List<Item> {
            new Item { Id = 1, Price = 2},
            new Item { Id = 2, Price = 5},
            new Item { Id = 3, Price = 1},
            new Item { Id = 4, Price = 10},
            new Item { Id = 5, Price = 2},
            new Item { Id = 6, Price = 1}
        };

Предпочтительно использовать LINQ.

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Если вам нужно получить сумму цен для комбинированного List<Item>, вы должны использовать метод GroupBy для группировки элементов по Id, а затем Sum цен для каждой группы

var combined = food.Union(drinks).Union(magazines).GroupBy(i => i.Id, i => i.Price,
    (i, prices) => new Item() { Id = i, Price = prices.Sum()}).OrderBy(i => i.Id).ToList();

Вы также можете добавить OrderBy, чтобы отсортировать результаты по свойству Id, если это важно

1 голос
/ 14 января 2020
var x =
    // First, combine all lists
    food.Concat(drinks).Concat(magazines)
    // Group combined Items by Id
    .GroupBy(item => item.Id)
    // From all groups create final Items with Id and summed Price
    .Select(g => new Item { Id = g.Key, Price = g.Sum(item => item.Price) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...