我怎样才能获得等于string []的项目?

时间:2009-08-26 13:06:59

标签: c# linq entity-framework lambda

我有一个字符串数组

var controlsToGet = new[] {"lblHome","lblContact"};

我有List<LanguageControl>,LanguageControl类包含控件。 我想从列表中获取Control.Name == controlsToGet

的控件

我正在寻找类似的东西

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

是否可以使用lambda或linq。

注意:我能用Nhibernate的Disjunction做到这一点,我正在寻找类似的东西

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

谢谢

5 个答案:

答案 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))