簡體   English   中英

如何通過使用 C# 中的 Linq 比較另一個列表中的值來過濾列表?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM