C# 通过另一个列表C LINQ筛选列表

C# 通过另一个列表C LINQ筛选列表,c#,linq,C#,Linq,考虑以下列表: class user { public int id {get; set;} public string name {get; set;} public bool selected {get; set;} } class coupon { public string username {get; set;} public string coupontype {get; set;} public string code {get; set;}

考虑以下列表:

class user {
   public int id {get; set;}
   public string name {get; set;}
   public bool selected {get; set;} 
}

class coupon {
   public string username {get; set;}
   public string coupontype {get; set;}
   public string code {get; set;}
}

List<user> lUser = new List<user>();
List<coupon> lCoupon = new List<coupon>();
您可以在lUser列表上使用LINQ Any方法,如下所示:

var coupons = lCoupon
    .Where(c => lUser.Any(u => u.selected && u.name == c.username))
    .ToList();

您也可以通过连接执行此操作:

var coupons = from coupon in lCoupons
          join user in lUser on coupon.username equals user.name
          where user.selected
          select coupon; 
通过这种方式,您可以轻松地从两种对象类型中选择值,例如:

var selectedObjects = from coupon in lCoupons
          join user in lUser on coupon.username equals user.name
          where user.selected
          select new { CouponCode = coupon.code, UserId = user.Id} ; 

如果你愿意,可以把这个列出来

您可以使用where user.selected,而无需将布尔值与True进行比较。请记住,whereny将遍历每个优惠券的用户列表,即,您将具有ONM的复杂性*联接操作对内部集合使用查找。这就给了你+Mcomplexity@SergeyBerezovskiy:糟糕的是,我不能+1那条评论。我确实想知道查找是如何创建的,毕竟,据我所知,它只是一个没有散列的列表。@Stefan你可以看一下。首次运行时,将创建内部集合的查找。然后在外部集合迭代期间使用它按键获取“连接”项
var selectedObjects = from coupon in lCoupons
          join user in lUser on coupon.username equals user.name
          where user.selected
          select new { CouponCode = coupon.code, UserId = user.Id} ;