LINQ查询基于列表的子串进行过滤

时间:2016-01-21 15:49:42

标签: c# linq

我有一个返回名为" results"的列表的查询。然后我需要过滤该列表以排除任何具有另一个列表中前两个字符的子串的记录。

我的初始结果的计数为36,在运行以下后,filteredResults的计数也为36.我确保delayCodes列表包含一个值,该值应该在&#中返回的至少两个记录中找到34;结果"名单。

var delayCodes = new string[] { "AT", "FA", "FC", "FP", "MI", "MT", "SD" };

var filteredResults = results.Select(i => !delayCodes.Contains(i.DLY_CODE.Substring(0,2)));

我已经完成了一些搜索,我看到有人建议使用.StartsWith,但他们通常会查看特定值,如.StartsWith(" xx")。我不知道如何告诉查询查看我的代码列表。

关于如何使这样的事情发挥作用的任何建议?

2 个答案:

答案 0 :(得分:6)

如果要过滤,则必须使用Where

var filteredResults = results.Where(i => !delayCodes.Contains(i.DLY_CODE.Substring(0,2)));

这是一种更有效(在大型集合中)的方法,它使用LINQ"左连接":

var filteredResults =
    from res in results
    join code in delayCodes
    on res.DLY_CODE.Substring(0, 2) equals code into gj
    from lj in gj.DefaultIfEmpty()
    where lj == null
    select res;

答案 1 :(得分:2)

与Tims解决方案交替使用:

var filteredResults = results.Where(i => delayCodes.All(x => x != i.DLY_CODE.Substring(0,2)));