C# 如何获取等于字符串[]的项?

C# 如何获取等于字符串[]的项?,c#,linq,entity-framework,lambda,C#,Linq,Entity Framework,Lambda,我有一个字符串数组 var controlsToGet = new[] {"lblHome","lblContact"}; 我有列表,LanguageControl类在其中保存控件。 我想从列表中获取控件,该列表Control.Name==controlsToGet 我在找这样的东西 var all = fooelements.where(l=>l.Control.Name == controlsToGet); lambda或linq有可能吗 注意:我可以用Nhibernate的析取来

我有一个字符串数组

var controlsToGet = new[] {"lblHome","lblContact"};
我有
列表
,LanguageControl类在其中保存控件。 我想从列表中获取控件,该列表
Control.Name==controlsToGet

我在找这样的东西

var all = fooelements.where(l=>l.Control.Name == controlsToGet);
lambda或linq有可能吗

注意:我可以用Nhibernate的析取来完成它,我正在寻找类似的东西

编辑:如果我想将此查询用于实体框架的数据库,我该怎么办

多谢各位

var all = fooelements
              .Where(l=>controlsToGet
                            .Contains(l.Control.Name));

如果每个项目都有一个控件列表:

var all = fooelements
              .SelectMany(l => l.Controls)
              .Where(c => controlsToGet
                             .Contains(c.Name));

如果
controlsToGet
是一个字符串,这将起作用:

var all = fooelements.SelectMany(l => l.Controls).Where(c => c.Name == controlsToGet);
但是,如果是
列表
,则需要:

var all = fooelements.SelectMany(l => l.Controls).Where(c => controlsToGet.Contains(c.Name));

你也可以用findall。如果microsoft对该方法进行优化,您将提高性能,否则,它将与foreach相同

var result = fooelements.FindAll(item=> controlsToGet.Contains(item.Name)); 

天真的解决方案,如:

fooelements.SelectMany(l => l.Controls).Where(c => controlsToGet.Contains(c.Name))
isO(n*m)其中n是控件数,m是名称数组中的字符串数。有些人可能会说这是吹毛求疵和。。。(yadda-yadda),但又有什么见鬼的-只要再多一点代码就可以为您提供一个O(n)解决方案:

var controlsToGet = new HashSet<string> { "lblHome", "lblContact" };
var controls = fooelements.SelectMany(l => l.Controls)
    .Where(c => controlsToGet.Contains(c.Name))
var controlsToGet=newhashset{“lblHome”,“lblContact”};
var controls=fooelements.SelectMany(l=>l.controls)
.Where(c=>controlsToGet.Contains(c.Name))

谢谢,我对lambdas没有太多经验。现在,我知道了如何处理它短lambda可能是伟大的。。。var result=fooelements.FindAll(item=>controlsToGet.Contains(item.Name));我不介意名誉的损失,但我希望那些被否决的人能发表评论。我很想知道这个答案到底出了什么问题,即使它只是为了帮助我自学…+1哈里斯,我能将它与实体框架一起使用吗?我已经试过了,但它不起作用。对不起,我从未使用过实体框架。如果此代码和实体框架存在特定问题,您最好使用一些代码示例来提出一个新问题,说明您正试图做什么。这一点很好。假设有足够的比较来克服进行散列的初始成本,这应该是一个更快的解决方案。是的,主要的一点是您已经消除了对控件名称数量的性能依赖性(这无疑会改变)。
var controlsToGet = new HashSet<string> { "lblHome", "lblContact" };
var controls = fooelements.SelectMany(l => l.Controls)
    .Where(c => controlsToGet.Contains(c.Name))