2016-01-21 72 views
2

我有一个返回一个名为“结果”列表中的查询。然后,我需要过滤该列表以排除在另一个列表中具有前两个字符的子字符串的任何记录。LINQ查询过滤器的基础上以列表的子串

我的初始结果的计数为36,在运行以下过滤器后,filteredResults的计数也是36.我确保delayCodes的列表包含一个值,该值应在至少两个记录中找到,结果“列表。

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”)的特定值。我不知道如何告诉查询来查看我的代码列表。

我如何能得到这样的事情有什么建议工作?

回答

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; 
+0

谢谢!我最初尝试了那些没有工作的地方,所以我尝试了。选择哪个也没有工作。我会测试你的建议代码,并让你知道它是如何工作的。 – Caverman

+0

我认为你的建议有效的方法将起作用。当我运行它时,结果从最初的计数从38减少到19。我会回过头来查看结果以确认一切正常,但我确定它是。我不明白你的代码是做什么的,所以我必须更多地研究它。 – Caverman

2

Alternativly到蒂姆斯的解决方案:

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

我试过这个,但最初的结果和filteredResults以相同的计数返回。我得看看数据来验证一些事情。问题是,我想我读过使用.ALL会找到满足的第一个条件,然后忽略其余部分。例如:如果5条记录以“SD”开始,一旦找到第一条记录,则会忽略其余记录。所以不是排除所有5个,它只会排除1? – Caverman

+0

不,实际上它会测试集合中的所有成员是否通过了条件。当第一个元素没有通过条件时,它停止。因此,对于每个元素来说''result''都会检查'delayCodes'内的所有元素是否与前者不同。 – HimBromBeere