У меня есть следующий список (упрощенный):
Name | Brand
Shirt0 | Adidas
Shirt1 | Nike
Shirt2 | Adidas
Shirt3 | Adidas
Shirt4 | Erima
Shirt5 | Nike
Я хочу заказать его по бренду и отобразить (максимум) два бренда в последовательности.
Поэтому я бы не отобразил все 3 продукта Adidas, но только два!
Результат:
Shirt0 | Adidas
Shirt2 | Adidas
Shirt1 | Nike
Shirt5 | Nike
Shirt4 | Erima
Shirt3 | Adidas
Таким образом, он берет два продукта от каждой марки и начинается, когда их больше нет.
Любые идеи, как достичь этого с помощью LINQ?
Я предполагаю, что ваш класс Product
имеет что-то вроде следующего свойства:
public String Brand { get; }
Я бы использовал следующий подход:
Brand
собственностиOrder
и назначьте его 0, если индекс внутри группировки меньше 2 и 1, если else (будет применяться для первого и второго элементов)Order
нашего анонимного классаЗапрос ниже:
var result = list
.GroupBy(x => x.Brand)
.SelectMany(g => g.Select((x, i) => new { Order = i < 2 ? 0 : 1, Product = x }))
.OrderBy(x => x.Order)
.Select(x => x.Product)
.ToList();
Я полагаю, что может быть лучший подход, но это прямо из головы.
Используя идеи здесь, вы можете сгруппировать элементы с каждой маркой в индексы, затем упорядочить по индексу и бренду и присоединиться к одному списку:
var results = products.GroupBy(p => p.Brand)
.SelectMany(pg => pg.Select((p, index) => new { Value = p, Index = index/2 }))
.OrderBy(a => a.Index).ThenBy(a => a.Value.Brand)
.Select(g => g.Value);
List<T>
когда говорите «список», потому что у вас есть два столбца данных вместо одного. Так какую структуру данных вы используете?List<T>
гдеT
это объект с 2 (или более) свойствами?