现在已经挣扎了一段时间。
我在WebAPI世界中蘸着我的脚趾,我有一个List,可以包含同名但价格不同的产品。我需要做的是删除所有对产品的引用是价格变化。
例如。
name =“Cornflakes”价格=“1.99M”
name =“Cornflakes”价格=“1.89M”
name =“Rice Krispies”价格=“2.09M”
name =“Cornflakes”价格=“2.09M”
否玉米片应出现在我的最终清单中。
我已经写了大量的文章,但它过早地删除了产品,我不确定我应该删除它们。
public IEnumerable<Product> GetProductsByCategory(int Id)
{
List<Product> sourceProductList = products.Where(p => p.CategoryID == Id).ToList();
List<Product> tempProducts = new List<Product>();
List<Product> targetProductList = new List<Product>();
foreach (var product in sourceProductList)
{
bool isInTempList = tempProducts.Any(x => x.Name == product.Name);
if (!isInTempList)
{
tempProducts.Add(product);
}
else
{
Product tempProduct = product;
bool isPriceDifferent = tempProducts.Where(y => y.Name == tempProduct.Name).Any(y => y.Price != tempProduct.Price);
if (isPriceDifferent)
{
tempProducts.RemoveAll(p => p.Name == product.Name);
// too soon as I may have lots of products with the same name
// but need to remove based on product.Name
}
}
}
targetProductList.AddRange(tempProducts);
return targetProductList;
}
非常感谢任何帮助。
注意:其他谷物可供选择
答案 0 :(得分:12)
尝试使用此LINQ表达式,该表达式仅选择具有一个不同价格的产品:
var result = sourceProductList
.GroupBy(x => x.Name)
.Where(g => g.Select(x => x.Price).Distinct().Count() == 1)
.Select(g => g.First());
看到它在线工作:ideone。
答案 1 :(得分:2)
请试试这个:
class Program
{
static void Main(string[] args)
{
var list = new List<Product>
{
new Product() {Name = "Cornflakes", Price = 100},
new Product() {Name = "Cornflakes", Price = 200},
new Product() {Name = "Rice Krispies", Price = 300},
new Product() {Name = "Cornflakes", Price = 400}
};
var uniqueItems = list.Where(w => (!list.Any(l=>l.Name.Equals(w.Name) && l != w)));
}
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
}
在结果中,您将只有一个“Rice Krispies”项目。我确信它比GroupBy和Distinct的解决方案更快,因为在你的情况下我们不需要做这些不必要的事情。
工作守则 - http://ideone.com/X8A3v
答案 2 :(得分:1)
这样的东西(写意可能会略微错误的语法):
var toRemove = sourceProductList
.GroupBy(p => p.Name)
.Where(g => g.Count() > 1)
.SelectMany(g => g)
.GroupBy(p => p.Price)
.Where(g => g.Count() > 1)
.SelectMany(g => g.Select(p => p.ID))
.Distinct()
.ToList();
toRemove.ForEach(id => sourceProductList.RemoveAll(p => p.ID == id));
答案 3 :(得分:1)
这应该像按名称分组一样简单,只获得组中只存在1个项目的那些:
var filtered = list.GroupBy(i => i.Name)
.Where(i => i.Count() == 1)
.SelectMany(x => x)