过滤从两个集合

时间:2018-01-23 23:24:26

标签: c# linq

我不确定我是否正确地解决了这个问题,但我正在尝试过滤收藏品。我正在研究物品和工具包的概念。套件由一件或多件物品组成。如果用户无权访问套件中的任何项目,则他无法访问该套件。

我拥有所有产品的集合以及用户可以访问的所有skus的另一个集合。

在下面的示例中,用户无法访问该工具包,因为如果该项目无法访问该工具包。

我正考虑创建一个只包含他有权访问的产品的新列表。请看下面,思考?此外,我可以为10K产品做这件事。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var allProducts = GetAllProducts();
        var allowedSkus = GetAllowedSkus();

        var allowedProducts = GetAllowedProducts(allProducts, allowedSkus);

        Assert.IsTrue(allowedProducts.Count() == 1);
    }

    private IEnumerable<Product> GetAllowedProducts(IEnumerable<Product> allProducts, IEnumerable<string> allowedSkus)
    {
        var products = new List<Product>();
        var skusinAllProducts = allProducts.Select(x => x.Sku);

        foreach (var product in allProducts)
        {
            if (product.ItemType.Equals("Item", StringComparison.OrdinalIgnoreCase))
            {
                products.Add(product);
            }
            else
            {
                //Need help here, not sure if I'm going about this correctly...
                var skusInKit = product.Components.Select(x => x.Sku);

                bool contains = true;

                foreach (var sku in skusInKit)                    {                       

                    if (!skusinAllProducts.Contains(sku))
                    {
                        contains = false;
                        break;
                    }
                }

                if (contains)
                {
                    products.Add(product);
                }
            }
        }

        return products;
    }

    private IEnumerable<string> GetAllowedSkus()
    {
        var skus = new string[] { "item-001", "item-003" };
        return skus;
    }

    private IEnumerable<Product> GetAllProducts()
    {
        var list = new List<Product>();

        var item001 = new Product
        {
            ItemType = "Item",
            Sku = "item-001"
        };

        var kit001 = new Product
        {
            ItemType = "Kit",
            Sku = "kit-001",
            Components = new List<Component>
            {
                new Component
                {
                    Sku = "item-002",
                    Quantity = 1
                },

                new Component
                {
                    Sku = "item-003",
                    Quantity = 1
                }
            }
        };

        list.Add(item001);
        list.Add(kit001);

        return list;
    }
}

1 个答案:

答案 0 :(得分:0)

我猜你在行中有一些错误:

var skusinAllProducts = allProducts.Select(x => x.Sku);

它应该只是allowedSkus。否则它没有意义,但如果我错了并且我错过了你的一些逻辑,请纠正我。

然后你需要的Lambda表达式是:

var products = allProducts.Where(p => 
                            p.ItemType.Equals("Item", StringComparison.OrdinalIgnoreCase) ||
                            (p.ItemType.Equals("Item", StringComparison.OrdinalIgnoreCase) == false &&
                            allowedSkus.Contains(p.Components.Sku)))
                            .ToList();

这将取代您的整个foreach