[英]How to filter a list by comparing a value from another list using Linq in C#?
我有一个包含名称和价格值的Fruit
列表。
public class Fruit {
public string name {get; set;}
public int price {get; set;}
public Fruit(string n, int p)
{
name = n;
price = p;
}
...
}
List<Fruit> myBasket = new List<Fruit>();
myBasket.Add(new Fruit("apple", 300));
myBasket.Add(new Fruit("banana", 200));
myBasket.Add(new Fruit("kiwi", 400));
此外,还有一份水果平均市场价格的清单。
List<Fruit> averagePrice = new List<Fruit>();
averagePrice.Add(new Fruit("apple", 500));
averagePrice.Add(new Fruit("banana", 100));
averagePrice.Add(new Fruit("kiwi", 600));
我想要做的是过滤 myBasket,使其只有价格低于平均价格的水果。
因此,在示例中,myBasket 将包含 apple 和 kiwi。
我试过myBasket = myBasket.Where(v => v.price < averagePrice.FirstOrDefault(y => y.name.Equals(v.name)).price).ToList();
.
它运行良好,但当 myBasket 中有新水果但myBasket
中没有新水果时,可能会出现averagePrice
指针异常。
我怎样才能改变它以防止它出现异常?
提前致谢。
这似乎是一种非常简单的方法:
myBasket =
(
from f in myBasket
join a in averagePrice on f.name equals a.name
where f.price < a.price
select f
).ToList();
这给了我:
这是等效的方法语法:
myBasket =
myBasket
.Join(averagePrice, f => f.name, a => a.name, (f, a) => new { f, a })
.Where(x => x.f.price < x.a.price)
.Select(x => x.f)
.ToList();
理解查询语法
Func<Fruit, bool> take = (fruit) =>
{
var query = averagePrice.Where(f => f.name == fruit.name);
return query.Count() == 0 ? true : fruit.price <= query.Min(f => f.price);
};
var result = from fruit in myBasket
where take(fruit)
orderby fruit.name
select fruit;
foreach ( var item in result )
Console.WriteLine($"{item.name}: {item.price}");
对于篮子中的每种水果,我们在平均列表中进行搜索,并采用可用的最低价格进行比较。
可以使用连接和投影等高级功能来优化此查询或其他...
Output
apple: 300
kiwi: 400
Output 不带平均香蕉
apple: 300
banana: 200
kiwi: 400
Lambda查询版
var result = myBasket.Where(fruit =>
{
var query = averagePrice.Where(f => f.name == fruit.name);
return query.Count() == 0 ? true : fruit.price <= query.Min(f => f.price);
});
foreach ( var item in result.OrderBy(f => f.name) )
Console.WriteLine($"{item.name}: {item.price}");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.