我有一个字符串数组
var controlsToGet = new[] {"lblHome","lblContact"};
我有List<LanguageControl>
,LanguageControl类包含控件。
我想从列表中获取Control.Name == controlsToGet
我正在寻找类似的东西
var all = fooelements.where(l=>l.Control.Name == controlsToGet);
是否可以使用lambda或linq。
注意:我能用Nhibernate的Disjunction做到这一点,我正在寻找类似的东西
编辑:如果我想将此查询用于实体框架的数据库,该怎么办?
谢谢
答案 0 :(得分:10)
var all = fooelements
.Where(l=>controlsToGet
.Contains(l.Control.Name));
如果每个项目都有列表控件:
var all = fooelements
.SelectMany(l => l.Controls)
.Where(c => controlsToGet
.Contains(c.Name));
答案 1 :(得分:3)
你也可以使用findall。如果微软优化该方法,您将提高性能,如果不是,它将与foreach
相同var result = fooelements.FindAll(item=> controlsToGet.Contains(item.Name));
答案 2 :(得分:2)
如果controlsToGet
是字符串,则可以使用:
var all = fooelements.SelectMany(l => l.Controls).Where(c => c.Name == controlsToGet);
但是,如果它是List<string>
则需要:
var all = fooelements.SelectMany(l => l.Controls).Where(c => controlsToGet.Contains(c.Name));
答案 3 :(得分:1)
var all = from control in listofcontrols
from toGet in controlsToGet
where toGet == control.name
select control;
答案 4 :(得分:1)
一个天真的解决方案,例如:
fooelements.SelectMany(l => l.Controls).Where(c => controlsToGet.Contains(c.Name))
是 O(n * m),其中 n 是控件的数量, m 是名称数组中的字符串数。有些人可能会认为这是挑剔和YAGNI和......(yadda yadda),但是哎呀 - 只需要多一点代码就能给你一个 O(n)解决方案:
var controlsToGet = new HashSet<string> { "lblHome", "lblContact" };
var controls = fooelements.SelectMany(l => l.Controls)
.Where(c => controlsToGet.Contains(c.Name))