c# - 从列表中选择值

标签 c# linq

我有以下列表:

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

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

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

ProductCode|WarehouseID
SKU001|2
SKU001|3
SKU002|3
SKU003|3
SKU004|1
SKU004|5

我有多个 SKU,因为该商品可以从多个仓库位置供应,因为它有库存。以SKU001为例,仓库ID 2的库存比仓库ID 3多。

我需要从最少数量的仓库位置中选择项目。我想要结束的是像

SKU001|3
SKU002|3
SKU003|3
SKU004|1

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

我正在使用 Linq 来尝试实现这一点,同时尝试循环每个列表项,但由于 Linq 对我来说不是强项,所以我很挣扎。我试图首先获得重复仓库 ID 的最高计数 using

products.GroupBy(i => i).OrderByDescending(grp => grp.Count()).Select(grp => grp.Key).FirstOrDefault();

但我迷失了其余的项目。关于如何实现此目标的任何想法?

最佳答案

您可以在多个语句中执行此操作,首先获取 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(),
                    });

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

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

对于输出:

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

输出:

SKU001 | 3
SKU002 | 3
SKU003 | 3
SKU004 | 1

关于c# - 从列表中选择值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25266960/

相关文章:

c# - json.net 使用 CamelCasePropertyNamesContractResolver 错误地转换 TimeZoneInfo

C# 在 SQL Server 中选择仅使用带有 sql 参数的日期

c# - 构造函数中的异常处理

c# - 我可以将局部变量作为常量而不是闭包引用捕获到 LINQ 表达式中吗?

c# - 在 LINQ 中使用 SUM() 时排除 NULL 值

c# - 元素不可见 Selenium/C#

c# - 如何为整个 C# 应用程序设置默认文化信息

c# - 如何使用 LINQ 和 C# 从 3 个不同的文件中查找最早的日期?

c# - 如何在 Fluent LINQ 中使用 or 子句进行连接

c# - 如何按属性对列表进行排序并对 HTML Razor 中的元素进行分组?