查找值列表<;T>;并在LINQ中的where语句中用作条件

本文关键字:语句 where 条件 中的 并在 列表 lt 查找 gt LINQ | 更新日期: 2023-09-27 18:22:09

我需要能够根据其中一个属性中的值是否存在于其他值的列表中来选择数据。现在我有这个:

//Just the definition of the different list objects for clarity
List<RouteDataItem> routeData;
List<RouteCodeItem> routeCodes;
var qrData = from d in routeData
             where d.Route == RouteType && q.RouteCode == [HERE IS WHERE I'M STUCK]
             select q;

routeData是一个对象的列表,RouteCode也是,所以基本上我想把它做成这样(伪LINQ/SQL类型的代码,尽管这是纯LINQ2Objects):

//Just the definition of the different list objects for clarity
List<RouteDataItem> routeData;
List<RouteCodeItem> routeCodes;
var qrData = from d in routeData
             where d.Route == RouteType && q.RouteCode in (routeCodes.ValidCode)                 
              select q;

我希望你们能理解我的象形文字。有没有一种简单的方法可以实现这一点?

查找值列表<;T>;并在LINQ中的where语句中用作条件

使用任意:-

 where d.Route == RouteType && routeCodes.Any(x => x.ValidCode == d.RouteCode)

或者使用方法语法:-

var qrData = routeData.Where(d => d.Route == RouteType && 
                                  routeCodes.Any(r => r.ValidCode == d.RouteCode));

您可以使用ContainsAny:

var qrData = from d in routeData
             where d.Route == RouteType 
             && routeCodes.Select(x => x.ValidCode).Contains(d.RouteCode)                
             select q;

var qrData = from d in routeData
             where d.Route == RouteType 
             && routeCodes.Any(x => x.ValidCode == d.RouteCode)
             select q;

为了获得更快的查找性能,您可以创建HashSet<T>:

var validCodes = new HashSet<whateveritis>(routeCodes.Select(x => x.ValidCode));
var qrData = from d in routeData
             where d.Route == RouteType && validCodes.Contains(d.RouteCode)
             select q;

你可以试试这个:

var qrData = from d in routeData
             where d.Route == RouteType && routeCodes.Any(x => x.ValidCode == d.RouteCode)
             select d;

虽然不能100%确定结果选择应该是什么。