Список заказов по значению с максимальным появлением последовательности

1

У меня есть следующий список (упрощенный):

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?

  • 0
    Я не думаю, что вы имеете в виду List<T> когда говорите «список», потому что у вас есть два столбца данных вместо одного. Так какую структуру данных вы используете?
  • 0
    Может быть, это List<T> где T это объект с 2 (или более) свойствами?
Показать ещё 6 комментариев
Теги:
linq

2 ответа

1
Лучший ответ

Я предполагаю, что ваш класс Product имеет что-то вроде следующего свойства:

public String Brand { get; }

Я бы использовал следующий подход:

  1. Групповые продукты по Brand собственности
  2. Оберните результат в каждой группе в анонимном классе с дополнительным свойством Order и назначьте его 0, если индекс внутри группировки меньше 2 и 1, если else (будет применяться для первого и второго элементов)
  3. Применить заказ на основе свойства Order нашего анонимного класса
  4. Выберите продукт, чтобы мы избавились от нашего анонимного класса-оболочки

Запрос ниже:

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();

Я полагаю, что может быть лучший подход, но это прямо из головы.

  • 1
    Это именно то, что я искал, большое спасибо! И выдает тот же результат, что и ответ от @Rhumborl
2

Используя идеи здесь, вы можете сгруппировать элементы с каждой маркой в индексы, затем упорядочить по индексу и бренду и присоединиться к одному списку:

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);
  • 1
    Благодарю. Это то, что я искал :) @danyloid представил тот же подход (но ранее), поэтому мне пришлось поставить ему галочку, извините: -S

Ещё вопросы

Сообщество Overcoder
Наверх
Меню