我不确定我是否正确地解决了这个问题,但我正在尝试过滤收藏品。我正在研究物品和工具包的概念。套件由一件或多件物品组成。如果用户无权访问套件中的任何项目,则他无法访问该套件。
我拥有所有产品的集合以及用户可以访问的所有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;
}
}
答案 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
。