Это просто
private bool ContainsResourceName(IEnumerable<TestResources> ListResNeeded, IEnumerable<TestResources> ListResInStock)
{
return ListResNeeded.All(resNeeded =>
ListResInStock.Any(resInStock =>
resInStock.Name == resNeeded.Name &&
resInStock.Amount >= resNeeded.Amount
)
);
}
Чтобы понять значение .Select
, .All
, .First
и многих других функций так называемого интерфейса IEnumerable
, вам придется изучить ленивый вычисление в C#, и есть слишком много, чтобы сказать.
ListResNeeded.Select(s => s.Name).ToList();
и другие операции с перечислителями легче читать с конца. Итак, с конца: вы составляете список (что?) Элементов, созданных функцией Select
(что она производит?), Она берет ресурс s
и возвращает s.Name
его (откуда эти ресурсы поступают ?) из списка ListResNeeded.
Опять же, вы должны прочитать больше о IEnumerator
в C# и о ленивой оценке в целом. Это важное понятие в программировании.
PS И некоторые предупреждения о коде, который вы пытались использовать. Что вы там делаете:
var list1WithName = ListResNeeded.Select(s => s.Name).ToList();
var list2WithName = ListResInStock.Select(s => s.Name).ToList();
делает полную копию обоих аргументов, переданных в функцию (представьте, что эти массивы будут намного больше, какой смысл их копировать?).
И вы создаете новый (третий) список после полного обхода обоих предыдущих, тогда как на самом деле вы ищете просто логический ответ.
result = !list1WithName.Except(list2WithName).Any();
Вы не Вам нужно полностью пройти оба списка, прежде чем вы узнаете, что ответ ложный. Вам просто нужно найти первый ресурс, который отсутствует, а затем прекратить поиск (он намного легче)