Я верю, что LINQ будет выглядеть немного некрасиво
var assets = item.Any(a=>HaRelevantAsset(a)) ? item.Where(a => HasRelevantAsset(a)) :
item.SubItems.SelectMany(item =>
item.Assets.Where(a => HasRelevantAsset(a)));
Я бы выбрал другой вариант, метод расширения
public static IEnumerable<Asset> SelectRelevantAssets(this Item item)
{
var assetsInItemFound = false;
foreach (var asset in item.Assets)
{
if (HasRelevantAsset(asset))
{
assetsInItemFound = true;
yield return asset;
}
}
if (assetsInItemFound)
{
yield break;
}
else
{
foreach (var subItem in item.SubItems)
foreach (var asset in subItem.Assets)
if (HasRelevantAsset(asset))
yield return asset;
}
}
Сначала я хотел попробовать рекурсивный вызов SelectRelevantAssets, я думаю, что это будет похоже на
if (!assetsInItemFound)
{
yield break;
}
else
{
foreach (var subItem in item.SubItems)
foreach (var asset in SelectRelevantAssets(subItem))
yield return asset;
}
Но это будет включать в себя активы, найденные в коллекции предметов активов подэлемента