2016-10-11 6 views
-3

Я искал здесь и в другом месте, но не могу найти то, что я прошу. У меня есть код из кода примера, над которым я работаю.LINQ/From-Select vs ForEach

public CountryViewModel(Region[] regions) 
    { 
     _regions = new ReadOnlyCollection<RegionViewModel>(
      (from region in regions 
      select new RegionViewModel(region)) 
      .ToList()); 
    } 

Я считаю, что выше эквивалентно:

public CountryViewModel(Region[] regions) 
    { 
     _regions = new ReadOnlyCollection<RegionViewModel>(); 
     foreach (region in regions) 
     { 
      _regions.Add(new RegionViewModel(region)); 
     } 
    } 

ли мое понимание правильно?

+0

У вас возникла проблема с вышеуказанным кодом, в котором вам нужна помощь? – jadarnel27

+0

Нет. Я пытаюсь подтвердить свое понимание того, что из/select в первом выражении будет заполнено _областями экземпляры RegionViewModel. Я знаю, что могу сделать это с помощью заявления foreach. Я думал, что вопрос был ясен, как было задано. –

ответ

3

Нет, фрагменты кода не эквивалентны. Второй фрагмент не компилируется по нескольким причинам. Вы не определили region, нет конструктора без параметров для ReadOnlyCollection<T>, а ReadOnlyCollection<T> не имеет метода Add. Поскольку первый фрагмент компилирует и успешно создает ReadOnlyCollection<RegionViewModel>, он не делает то же самое.

+0

Действительно, ReadOnlyCollection имеет метод Add, так как он наследует интерфейс ICollection , но генерирует NotSupportedException –

+0

См. Мой комментарий выше. –

+0

@DavidGreen Что относительно ответа не было ясно? Вы спросили, эквивалентны ли эти два фрагмента. Их нет, и я объяснил, почему они не являются. – Servy

-1

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

Однако могут быть отличия в производительности, о которых я не мог комментировать. У меня нет большого опыта работы с внутренними работами C#, но я подозреваю, что оператор LINQ даст лучшую производительность. Однако я мог быть совершенно ошибаюсь в этом утверждении.

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

Смежные вопросы