Использование LINQ .Выберите и .Any в одной строке. - PullRequest
0 голосов
/ 31 января 2020

Я хочу оптимизировать некоторый код до меньшего количества строк и без необходимости использовать циклы for, используя LINQ, если это возможно. Я видел аналогичный пост с просьбой выбрать и где в одной строке, но это не совсем то же самое.
Предположим, у меня есть:

Список элементов в " fields " который имеет свойства " Id " и " Name ", которые можно получить, вызывая соответственно .Id и .Name

Ex.  
fields[0] = Element  
fields[0].Id = 12345
fields[0].Name = Name01

Я хочу создать новый список " FilterIds ", содержащий свойства Id выбранных полей.

This is the for loop version:  
List<Id> filteredIds = new List<Id>();
fields = {Element1, Element2, ...}; //List of Elements
List<string> selectedNames = new List<string>() {"Name01", "Name05", "Name10"};
foreach (Element e in fields):
          if (selectedNames.Contains(e.Name())
          {
          filteredIds.Add(e.Id);
          }

Можно ли это сделать в одной строке, как это в LINQ?

filteredIds = fields.Select(i => i.Id).Any(o => selectedNames.Contains(o.Name)).ToList();

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Any() возвращает true / false значения. Вам нужно позвонить Where(), чтобы фактически отфильтровать результаты.

filteredIds = fields.Where(o => selectedNames.Contains(o.Name)).Select(i => i.Id).ToList();
1 голос
/ 31 января 2020

Почти правильно. Вы должны использовать Where для фильтрации списка, а не Any.

Any возвращает логическое значение, которое имеет значение true, если хотя бы один элемент в списке удовлетворяет предикату, а Where возвращает все элементы, которые удовлетворяют предикату.

Вам также необходимо применить фильтр Where до выбора, так как свойство name удаляется выбором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...