canard29 Ответов: 2

Преобразование цикла foreach в запрос LINQ


Я пытаюсь написать приведенный ниже код в LINQ

Спасибо,

List<Type> selectedList = new List<Type>();
foreach (Type type in allTypes)
{
  if (type != null)
  {
      if (type.BaseType != null)
      {
         if (type.BaseType.Name == "MyBASETYPE")
         {
            inheritedList.Add(type);
         }
      }
   }
}


Что я уже пробовал:

Я написал это, но, похоже, это не работает, потому что в некоторых случаях базовый тип равен нулю

var selectedList = allTypes.Where(p => p.BaseType.Name == "MyBASETYPE").Select(p => new { p });

Graeme_Grant

Удалять .Select(...).

2 Ответов

Рейтинг:
2

F-ES Sitecore

Вместо того чтобы пытаться использовать LINQ без причины (Если вы думаете, что он будет работать лучше, подумайте еще раз, LINQ часто медленнее), вам лучше улучшить свое понимание основ.

List<Type> selectedList = new List<Type>();
foreach (Type type in allTypes)
{
  if (type != null && type.BaseType != null && type.BaseType.Name == "MyBASETYPE")
  {
      inheritedList.Add(type);
   }
}


Как уже упоминалось в другом решении, в зависимости от вашей версии .net вы также можете использовать "?."


Рейтинг:
0

Eric Lynch

Не уверен, чего ты ждешь от меня. inheritedList в вашем примере. Кроме того, я полагаю, что вы ищете следующее (чтобы быть полностью эквивалентным):

var selectedList = allTypes
  .Where(type => type != null && type.BaseType != null &&
    type.BaseType.Name == "MyBASETYPE")
  .ToList();


Graeme_Grant

.ToList() требуется только в том случае, если требуется ранняя оценка. Кроме того, вы можете упростить свой ответ на:

var selectedList = allTypes
  .Where(type => type?.BaseType?.Name == "MyBASETYPE");

Mycroft Holmes

И снова я кое - что узнаю-ты даже не представляешь, через какое дерьмо мне пришлось пройти, ловя нули!

Graeme_Grant

Это определенно экономящий время рефакторинг! :)

Eric Lynch

Правильно по обоим пунктам...и стоит указать на это другим читателям.

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

Я также осознаю опасность преждевременной материализации. Однако, по его примеру, selectedList был специально объявлен список, который является, почему я включил в список. Для других читателей, для получения дополнительной информации об опасностях преждевременной материализации, пожалуйста, ознакомьтесь с моей предыдущей статьей:

https://www.codeproject.com/Articles/1236958/LINQ-Part-A-Deep-Dive-into-IEnumerable

Причина, по которой я написал эту статью, состояла в том, чтобы лучше объяснить IEnumerable и, надеюсь, помочь людям избежать ошибки всегда лавировать на ToList...или что-то еще, что могло бы вызвать преждевременную материализацию.

На несвязанной ноте я был удивлен, увидев оценку в две звезды на этом решении. Не знаю, что я сделал, чтобы заслужить это :)

George Swan

Отличный ответ. Не то чтобы это имело большое значение, но разве ваше решение не является операцией или?