从列表中选择值

KDe*_*Dee 10 c# linq

我有以下列表:

public class Products
{
 public string SKU;
 public int WarehouseID;
}

List<Products> products = new List<Products>();
Run Code Online (Sandbox Code Playgroud)

在填充列表后,我最终得到以下数据:

ProductCode|WarehouseID
SKU001|2
SKU001|3
SKU002|3
SKU003|3
SKU004|1
SKU004|5
Run Code Online (Sandbox Code Playgroud)

我有多个SKU,因为该物品可以从库存中的多个仓库位置提供.在SKU001的情况下,仓库ID 2的库存比仓库ID 3多.

我需要从最少数量的仓库位置中选择项目.我想要最终得到的是类似的东西

SKU001|3
SKU002|3
SKU003|3
SKU004|1
Run Code Online (Sandbox Code Playgroud)

这将产品选择限制在仅2个位置,因为SKU001,SKU002和SKU003都可以从仓库ID 3中获得.理想情况下,从库存最多但限制位置数量的位置进行选择更为重要.

我正在尝试使用Linq来尝试循环每个List项目,但是由于Linq对我来说不是一个强项,我正在努力.我试图首先获得重复仓库ID的最高计数

products.GroupBy(i => i).OrderByDescending(grp => grp.Count()).Select(grp => grp.Key).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

但我对其他物品感到迷茫.关于如何实现这一点的任何想法?

Hab*_*bib 1

您可以在多个语句中执行此操作,首先了解WarehouseID每个仓库中的不同产品及其数量,例如:

var query = products.GroupBy(r => r.WarehouseID)
                    .Select(grp => new
                    {

                        WarehouseID = grp.Key,
                        DistinctProducts = grp.Select(r => r.SKU).Distinct(),
                        DistinctCount = grp.Select(r => r.SKU).Distinct().Count(),
                    });
Run Code Online (Sandbox Code Playgroud)

稍后创建一个结果列表,例如:

List<Products> result = new List<Products>();

foreach (var item in query.OrderByDescending(r => r.DistinctCount)) //warehouse with most products
{
    if (!result.Any(r => item.DistinctProducts.Any(t => t == r.SKU)))
    {
        result.AddRange(item.DistinctProducts.Select(r => new Products { SKU = r, WarehouseID = item.WarehouseID }));
    }
}
Run Code Online (Sandbox Code Playgroud)

对于输出:

foreach (var item in result)
{
    Console.WriteLine("{0} | {1}", item.SKU, item.WarehouseID);
}
Run Code Online (Sandbox Code Playgroud)

输出:

SKU001 | 3
SKU002 | 3
SKU003 | 3
SKU004 | 1
Run Code Online (Sandbox Code Playgroud)