using System.Collections.Generic;
using System.Linq.Expressions;
namespace MeuPortfolio.Batch.Tests.ConsoleApp
private static List<Portfolio> portfolios = Portfolio.GetPortfolios();
public static void Main(string[] args)
CheckPortfolio(portfolios.Where(p => 1.Equals(p.Id)).First());
CheckPortfolio(portfolios.Where(p => 3.Equals(p.Id)).First());
Console.WriteLine("Refactored");
CheckPortfolioRefactored(portfolios.Where(p => 1.Equals(p.Id)).First());
CheckPortfolioRefactored(portfolios.Where(p => 3.Equals(p.Id)).First());
private static void CheckPortfolio(Portfolio portfolio)
var criteria = new PortfolioType[] { PortfolioType.CONSOLIDATED, PortfolioType.OPENED };
var availablePortfolios = new List<Portfolio>();
if (PortfolioType.CONSOLIDATED.Equals(portfolio.PortfolioType))
availablePortfolios = portfolios.Where(p => !criteria.Contains(p.PortfolioType)).ToList();
if (PortfolioType.OPENED.Equals(portfolio.PortfolioType))
availablePortfolios = portfolios.Where(p => PortfolioType.CONSOLIDATED.Equals(p.PortfolioType)).ToList();
Console.WriteLine("***************");
Console.WriteLine($"PortfolioType Selected: {portfolio.PortfolioType}");
availablePortfolios.ForEach(p => Console.WriteLine(p));
Console.WriteLine("***************\n");
private static void CheckPortfolioRefactored(Portfolio portfolio)
var availablePortfolios = portfolios.Where(CustomExpression(portfolio.PortfolioType)).ToList();
Console.WriteLine("***************");
Console.WriteLine($"PortfolioType Selected: {portfolio.PortfolioType}");
availablePortfolios.ForEach(p => Console.WriteLine(p));
Console.WriteLine("***************\n");
private static Func<Portfolio, bool> CustomExpression(PortfolioType portfolioType)
Func<Portfolio, bool> exp = (t) => false;
case PortfolioType.CONSOLIDATED:
var criteria = new PortfolioType[] { PortfolioType.CONSOLIDATED, PortfolioType.OPENED };
exp = d => !criteria.Contains(d.PortfolioType);
case PortfolioType.OPENED:
exp = d => PortfolioType.CONSOLIDATED.Equals(d.PortfolioType);
public int Id { get; set; }
public string Name { get; set; }
public PortfolioType PortfolioType { get; set; }
public static List<Portfolio> GetPortfolios()
return new List<Portfolio>()
new Portfolio() { Id = 1, Name = "A", PortfolioType = PortfolioType.OPENED },
new Portfolio() { Id = 2, Name = "B", PortfolioType = PortfolioType.FUND },
new Portfolio() { Id = 3, Name = "C", PortfolioType = PortfolioType.CONSOLIDATED },
new Portfolio() { Id = 4, Name = "D", PortfolioType = PortfolioType.OPENED },
new Portfolio() { Id = 5, Name = "E", PortfolioType = PortfolioType.CONSOLIDATED },
new Portfolio() { Id = 6, Name = "F", PortfolioType = PortfolioType.PORTFOLIO },
new Portfolio() { Id = 7, Name = "A", PortfolioType = PortfolioType.OPENED },
new Portfolio() { Id = 8, Name = "B", PortfolioType = PortfolioType.FUND },
new Portfolio() { Id = 9, Name = "C", PortfolioType = PortfolioType.CONSOLIDATED },
new Portfolio() { Id = 10, Name = "D", PortfolioType = PortfolioType.OPENED },
new Portfolio() { Id = 11, Name = "E", PortfolioType = PortfolioType.CONSOLIDATED },
new Portfolio() { Id = 12, Name = "F", PortfolioType = PortfolioType.PORTFOLIO }
public override string ToString() => $"Id: {Id} - Type: {PortfolioType} - Name: {Name}";
public enum PortfolioType