public class Product
{
public string Code { get; set; }
public string Name { get; set; }
public string Amount { get; set; }
}
public List<Product> Products = new List<Product>()
{
new Product() { Code = "A1", Name = "Vacuum", Amount = "10" },
new Product() { Code = "A2", Name = "Iron", Amount = "20" },
new Product() { Code = "A3", Name = "Kettle", Amount = "13" },
new Product() { Code = "A2", Name = "Microwave", Amount = "11" },
new Product() { Code = "A3", Name = "Dryer", Amount = "3" }
};
Мне нужно выбрать все продукты без повторяющегося кода. Товары с одинаковым кодом должны быть объединены в одну строку, в этом случае название и сумма должны быть разделены запятыми. Как изменить следующий код, чтобы сделать его более элегантным
var list1 = new List<Product>();
var gl = Products.GroupBy(x => x.Code).Where(x => x.Count() > 1);
gl.ToList().ForEach(x => list1.AddRange(x));
var list2 = Products.Where(x => !list1.Contains(x)).ToList(); // uniq values
var list3 = gl.Select(x =>
{
var p = new Product() { Code = x.Key };
p.Name = string.Join(",", x.ToList().Select(r => r.Name).Distinct());
p.Amount = string.Join(",", x.ToList().Select(r => r.Amount).Distinct());
return p;
}).ToList();
list2.AddRange(list3);
list2.ForEach(x =>
{
Console.WriteLine($"{x.Code.PadRight(20)},{x.Name.PadRight(20)},{x.Amount.PadRight(20)}");
});
результат должен быть:
Code Name Amount
A1 Vacuum 10
A2 Iron, Microwave 20, 11
A3 Kettle, Dryer 13, 3
@TheGeneral отредактировал, я поставил ожидаемый результат
@John, моя логика состоит в том, чтобы разделить повторяющиеся и уникальные коды в разные списки, затем обработать дубликаты, а затем добавить их обратно в список продуктов с уникальным кодом.
Но почему? Почему бы просто не использовать один .GroupBy(...).Select(...)
? Ведь один предмет станет группой с одним предметом, а затем выйдет с другой стороны как единый предмет.
Используйте GroupBy
на Code
, затем повторите его, чтобы отдельные элементы объединились с помощью string.Join()
.
var results = products
.GroupBy
(
p => p.Code
)
.Select
(
g => new
{
Code = g.Key,
Name = string.Join
(
",",
g.Select( p => p.Name )
),
Amount = string.Join
(
",",
g.Select( p => p.Amount.ToString() )
)
}
);
Выход:
A1 Vacuum 10
A2 Iron,Microwave 20,11
A3 Kettle,Dryer 13,3
Это хороший вопрос, если не считать того факта, что ожидаемого результата нет, а часть, описывающая его, немного двусмысленна.