Как я могу получить элементы, которые равны строке []? - PullRequest
0 голосов
/ 26 августа 2009

У меня есть массив строк

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

У меня есть List<LanguageControl>, и класс LanguageControl содержит элементы управления. Я хочу получить элементы управления из списка, который Control.Name == controlsToGet

Я ищу что-то подобное

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

Это возможно с лямбда или linq.

Примечание: я смог сделать это с помощью Dishunction Nhibernate, я ищу что-то подобное

РЕДАКТИРОВАТЬ: Что бы я сделал, если я хочу использовать этот запрос для базы данных с Entity Framework?

Спасибо

Ответы [ 5 ]

10 голосов
/ 26 августа 2009
var all = fooelements
              .Where(l=>controlsToGet
                            .Contains(l.Control.Name));

Если каждый элемент имеет список элементов управления:

var all = fooelements
              .SelectMany(l => l.Controls)
              .Where(c => controlsToGet
                             .Contains(c.Name));
3 голосов
/ 26 августа 2009

Вы также можете использовать findall.Если Microsoft оптимизирует метод, вы увеличите производительность, в противном случае она будет такой же, как foreach

var result = fooelements.FindAll(item=> controlsToGet.Contains(item.Name)); 
2 голосов
/ 26 августа 2009

Если 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));
1 голос
/ 26 августа 2009

Наивное решение, такое как:

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))
1 голос
/ 26 августа 2009
var all = from control in listofcontrols
          from toGet  in controlsToGet
          where toGet == control.name
          select control;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...