[英]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.