2015-02-23 62 views
0

我有下面的类LINQ的选择,其中在列表

public class Group 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

和2列出List<string> groupRestrictList<Group> groups

现在组列表包含一些团体已填写所有领域,我想选择的所有限制groupRestrict列表只包含组的名称。

我尝试了一些东西,但出于某些原因,它总是返回一个空列表。这是我的最后一次测试:

var lst = groups.Where(j => groupRestrict.Contains(j.Name)).ToList();

任何线索可能什么错?

编辑:像评论说,这应该有工作,这是有一些'输入,但现在我想有该groupRestrict不必是确切的名称,但可以用'像'功能。

当前表达式:

var restrictedGroups = (from gr in groupRestrict join g in groups on gr equals g.Name select g).ToList();

+2

请注意,这是一个bigO--而是在HashSet(或Dictionary)上执行此查询并考虑使用'.Join'或'.GroupJoin'(无论您想要左连接还是全连接) – 2015-02-23 13:01:16

+0

@AndreasNiedermair它是不在SQL数据库上,如果这是你所指的:) – Kiwi 2015-02-23 13:02:54

+5

这应该工作。请注意,字符串比较默认情况下区分大小写。 – helb 2015-02-23 13:03:12

回答

2

尝试:

var lst = groups.Where(j => groupRestrict.Any(x=> j.Name.Contains(x))).ToList(); 

这将匹配所有组,包含来自searchList一个或多个字符串名称。

大小写不敏感的变体将是:

var lst = groups.Where(j => groupRestrict.Any(x=> j.Name.ToLower().Contains(x.ToLower()))).ToList(); 

Allthough这将是更好的groupRestrict转换之前,在这种情况下,查询为小写,你可以省略.ToLower()调用X:

string[] lowerCaseGroupRestrict = groupRestrict.Select(x=> x.ToLower()).ToArray(); 
var lst = groups.Where(j => lowerCaseGroupRestrict.Any(x=> j.Name.ToLower().Contains(x))).ToList(); 
+0

非常感谢! groupRestrict是一个用户输入(尽管它首先被检查和过滤)。所以事先可以很容易地称为:) – Kiwi 2015-02-24 06:59:14

+0

对不起,完全忘了它! :) – Kiwi 2015-02-24 07:32:47