Я не думаю, что это действительно хороший кандидат для преобразования в LINQ - по крайней мере, в его нынешнем виде.
Да, у вас есть вложенный цикл foreach - но вы делаете что-то еще в цикле foreach верхнего уровня, так что это не простая для преобразования форма, которая просто содержит вложенность.
Что еще более важно, основная часть вашего кода посвящена побочным эффектам, будь то запись в консоль или изменение значений в найденных объектах. LINQ хорош, когда у вас есть сложный запрос, и вы хотите зациклить его, чтобы воздействовать на каждый элемент по очереди, возможно, с побочными эффектами ... но ваши запросы не являются действительно сложными, поэтому Вы бы не получили много пользы.
Одна вещь, которую вы могли бы сделать, это дать Blueprint
и Product
общий интерфейс, содержащий Id
и Name
. Затем вы можете написать один метод для обновления продуктов и чертежей с помощью itemsDictionary
на основе запроса для каждого:
UpdateNames(itemsDictionary, blueprints);
UpdateNames(itemsDictionary, blueprints.SelectMany(x => x.Input.Keys));
...
private static void UpdateNames<TSource>(Dictionary<string, string> idMap,
IEnumerable<TSource> source) where TSource : INameAndId
{
foreach (TSource item in source)
{
string name;
if (idMap.TryGetValue(item.Id, out name))
{
item.Name = name;
}
}
}
Предполагается, что на самом деле не требуется вывод консоли. Если вы это сделаете, вы всегда можете передать соответствующий префикс и добавить блок «else» в метод. Обратите внимание, что я использовал TryGetValue
вместо двух поисков в словаре для каждой итерации.