Multicolumn LIST<T> - Поиск дубликатов одного столбца на основе другого столбца
Мне нужно найти дубликаты элементов одного столбца (Qty
) на основе другого столбца (Priority
). У меня есть список, который содержит следующие данные:
Priority Product Qty
0 a 10
0 b 20
1 c 50
1 d 20
1 e 50
1 f 10
1 g 20
1 h 10
Мне нужно произвести сортировку List<T>
который содержит только дубликаты с точки зрения Qty
среди предметов с приоритетом 0
,
Т.е. полученный List<T>
будет содержать:
Priority Product Qty
0 a 10
1 f 10
1 h 10
0 b 20
1 d 20
1 g 20
Есть ли простое выражение LINQ/Lambda для этого?
3 ответа
Решение
Вот решение с GroupBy
:
var result = input
.GroupBy(p => p.Qty)
.Where(g => g.Any(p0 => p0.Priority == 0))
.Where(g => g.Skip(1).Any())
.SelectMany(g => g)
.OrderBy(g => g.Qty);
Попробуй это:
static void Main(string[] args)
{
var items = new List<Item>
{
new Item { Priority = 0, Product = "a", Qty = 10 },
new Item { Priority = 0, Product = "b", Qty = 20 },
new Item { Priority = 1, Product = "c", Qty = 50 },
new Item { Priority = 1, Product = "d", Qty = 20 },
new Item { Priority = 1, Product = "e", Qty = 50 },
new Item { Priority = 1, Product = "f", Qty = 10 },
new Item { Priority = 1, Product = "g", Qty = 20 },
new Item { Priority = 1, Product = "h", Qty = 10 }
};
foreach (var group in items.Where (i => i.Priority == 0)
.GroupBy(i => i, g => items
.Where (t => t.Qty == g.Qty &&
t.Product != g.Product)))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(group.Key); // Priority == 0
Console.ForegroundColor = ConsoleColor.Gray;
foreach (var item in group.SelectMany(i => i)) // dups
Console.WriteLine("\t{0}", item);
}
}
class Item
{
public int Priority { get; set; }
public string Product { get; set; }
public int Qty { get; set; }
public override string ToString()
{
return String.Format("{0}\t{1}\t{2}",
this.Priority, this.Product, this.Qty);
}
}
Предполагая, что у вас есть перечисляемый контейнер с именем list, который содержит элементы со свойствами Priority, Product и Qty:
var orderedResult = list.Where(element => !list.Contains(x => x != element && x.Priority == element.Priority && x.Qty == element.Qty)).OrderBy(element => element.Qty).ThenBy(element => element.Priority);