Метод расширения ForEach обычно не стоит беспокоиться.
Эрик Липперт написал об этом в блоге , и его философское возражение против этого состоит в том, что оно выглядит как выражение без побочных эффектов (как большинство функций Linq), но на самом деле это побочное действие в маскировка.
Если вы хотите выполнить действие для каждого элемента в списке, используйте оператор foreach. Вот для чего это.
Если вы хотите манипулировать списками действий, то вы можете это сделать, но тогда вы хотите IEnumerable<Action>
.
Для первой части вашего кода, как насчет:
var errorList = GetResultRows().Where(row => row.Field<string>("status").Equals("FAILURE", StringComparison.InvariantCultureIgnoreCase)
.ToList();
У вас есть List<string>
, называемый исключенными книгами. Вместо этого используйте HashSet<string>
, и вам не нужно проверять, добавлена ли к нему строка:
var excludedBooks = new HashSet<string>();
foreach (DataRow row in errorList)
{
if (ToUseBooksList.Contains((string)row["main_book"]))
{
BookCheckResults.AddRow(string.Format("Error for MainBook {0}, RiskType {1}",
row["main_book"], row["risk_type"]));
excludedBooks.Add((string)row["main_book"]);
}
}
Вы также можете отфильтровать список с помощью Where
:
var excludedBooks = new HashSet<string>();
foreach (DataRow row in errorList.Where(r => ToUseBooksList.Contains((string)r["main_book"]))
{
BookCheckResults.AddRow(string.Format("Error for MainBook {0}, RiskType {1}",
row["main_book"], row["risk_type"]));
excludedBooks.Add((string)row["main_book"]);
}