C# 如何通过在C中使用Linq比较另一个列表中的值来筛选列表?

C# 如何通过在C中使用Linq比较另一个列表中的值来筛选列表?,c#,list,linq,collections,compare,C#,List,Linq,Collections,Compare,我有一份水果清单,上面有名字和价格 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<

我有一份水果清单,上面有名字和价格

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.Wherev=>v.pricey.name.Equalsv.name.price.ToList

它工作得很好,但当myBasket中有新的水果但averagePrice中没有时,可能会出现空指针异常

我如何更改它以防止它发生异常

提前感谢。

理解查询语法

无平均香蕉产量

Lambda查询版本

理解查询语法

无平均香蕉产量

Lambda查询版本


这似乎是一个非常简单的方法:

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();

这似乎是一个非常简单的方法:

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();

我试过你的问题,它似乎和我的问题有相同的问题。如果kiwi在我的购物篮中,但不在averagePrice中,则在搜索kiwi时会出现System.InvalidOperationException..我尝试了您的查询,但它似乎与我在问题中的查询存在相同的问题。若猕猴桃在我的篮子里,但不在平均价格里,那个么搜索猕猴桃时会出现System.InvalidOperationException..我必须学习连接。。。如果香蕉不在平均名单上呢?接受还是不接受?我想,香蕉在加入时不会被接受,因为它不是平均价格?@OlivierRogier-它不会接受。连接的两边必须相等。您可以使用f.name上的join a in averagePrice将a.name加入到g中进行左外连接,然后g可以包含零个或多个匹配项。那将是一个团体加入。@Enigmativity我总有一天要学习加入。。。我什么也不懂:@W.Cointreau-那也可以。查询语法只是语法糖。我必须学习连接。。。如果香蕉不在平均名单上呢?接受还是不接受?我想,香蕉在加入时不会被接受,因为它不是平均价格?@OlivierRogier-它不会接受。连接的两边必须相等。您可以使用f.name上的join a in averagePrice将a.name加入到g中进行左外连接,然后g可以包含零个或多个匹配项。那将是一个团体加入。@Enigmativity我总有一天要学习加入。。。我什么也不懂:@W.Cointreau-那也可以。查询语法只是语法糖。
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();