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.price这似乎是一个非常简单的方法:
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();