Ответ 1
Ну, я бы ожидал, что эта строка выбрала исключение:
var documentRow = _dsACL.Documents.First(o => o.ID == id)
First()
будет выдавать исключение, если он не может найти подходящие элементы. Учитывая, что вы сразу же проверяете нулевое значение, похоже, что вы хотите FirstOrDefault()
, который возвращает значение по умолчанию для типа элемента (которое null для ссылочных типов), если не найдено совпадающих элементов:
var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)
Другие варианты для рассмотрения в некоторых ситуациях: Single()
(когда вы считаете, что есть только один соответствующий элемент) и SingleOrDefault()
(когда вы считаете, что есть только один или нулевой соответствующий элемент). Я подозреваю, что FirstOrDefault
- лучший вариант в этом конкретном случае, но он все равно знает о других.
С другой стороны, похоже, что на самом деле вам может быть выгоднее присоединиться к вам в первую очередь. Если вам было все равно, что он будет делать все совпадения (а не только первые), вы можете использовать:
var query = from target in _lstAcl.Documents
join source in _dsAcl.Document
where source.ID.ToString() equals target.ID
select new { source, target };
foreach (var pair in query)
{
target.Read = source.Read;
target.ReadRule = source.ReadRule;
// etc
}
Это более простая и эффективная ИМО.
Даже если вы решите сохранить цикл, у меня есть несколько предложений:
- Избавьтесь от внешнего
if
. Вы не нуждаетесь в этом, как если бы Count было равно нулю, тело цикла цикла никогда не выполнит -
Используйте эксклюзивные верхние границы для циклов - они более идиоматичны в С#:
for (i = 0; i < _lstAcl.Documents.Count; i++)
-
Устранить общие подвыражения:
var target = _lstAcl.Documents[i]; // Now use target for the rest of the loop body
-
По возможности используйте
foreach
вместоfor
, чтобы начать с:foreach (var target in _lstAcl.Documents)