Попытка изменить свойства набора IQueryable

Оба [expr.pos]/1 и [expr.ass]/6 согласны с тем, что целочисленное переполнение битового поля (со знаком или без знака) определяется реализацией.

[expr.pos]/1

[...] Если операндом является битовое поле, которое не может представлять увеличенное значение, результирующее значение битового поля равно от реализации.

[expr.ass]/6

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

blockquote>

Я исправил страницу cppreference. Спасибо, что заметили.

9
задан Brandon Watson 10 February 2009 в 17:25
поделиться

2 ответа

Brandon, это - нормальная ошибка при использовании LINQ. Посмотрите, IQueryable, возвращенный из LINQ, на самом деле не содержит Ваши объекты, вот почему Вы не можете индексировать в него. Это имеет только достаточно информации для выполнения запроса, когда Вы на самом деле просите объекты. Это называют "задержанным выполнением", потому что запрос не выполняется когда Вы select, но позже, когда Вы перечисляете результаты. Можно искать "linq задержанное выполнение" и найти много людей, пытающихся объяснить, как оно работает.

Когда Вы делаете Ваш foreach, запрос работает, и Вы называете fixData () на каждом объекте, как Вы предназначили. Однако при доступе к IQueryable снова Вы выполните запрос во второй раз, и (в зависимости от поставщика LINQ, которого Вы используете), Вы могли бы, вводя исходные неизмененные объекты во второй раз.

Путем вызова ToList () на IQueryable, Вы создаете Список в оперативной памяти со всеми результатами запроса. Можно теперь индексировать в этот список и получить доступ ко всему этому, Вы хотите, не выполняя запрос снова. Если Вы, соглашаются с наличием всех объектов в памяти (небольшой набор результатов), то использование ToList () может быть хорошим решением для Вас.

@PaulG, Вы правы, что он может использовать foreach вместо for, но он должен сохранить ссылку на список, или иначе он прав, где он запустил (с IQueryable).

var items = goodWords.ToList();

foreach (var item in items)
{
    item.fixData();
}
16
ответ дан 4 December 2019 в 13:05
поделиться

Я полагаю, что Ваш goodWords IQueryable<CWords> ввести?

Итак, почему бы не любить это?

foreach (CWords item in goodWords.ToList())
{
    item.fixData();
}
0
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: