C
Christine25
Guest
Hi, I found a C# question in a book and not sure how to solve it.
Can you please assist?
what is the correct way of searching for a red vehicle with low mileage and a medium price?
public class Vehicle
{
public string RegistrationNumber { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string YearOfManufacture { get; set; }
public string Color { get; set; }
public decimal Price { get; set; }
public int Mileage { get; set; }
public void SendToCollection()
{
Console.WriteLine(RegistrationNumber);
}
}
public class RedSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Color == "Red";
}
}
public class BlueSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Color == "Blue";
}
}
public class WhiteSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Color == "White";
}
}
public class LowPriceSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Price <= 50000 ;
}
}
public class MediumPriceSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Price > 50000 && entity.Price <= 100000;
}
}
public class HighPriceSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Price > 100000;
}
}
public class LowMileageSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Mileage <= 40000;
}
}
public class MediumMileageSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Mileage > 40000 && entity.Price <= 120000;
}
}
public class HighMileageSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Mileage > 120000;
}
}
public interface ISpecification<T>
{
bool IsSatisfiedBy(T entity);
ISpecification<T> And(ISpecification<T> other);
ISpecification<T> AndNot(ISpecification<T> other);
ISpecification<T> Or(ISpecification<T> other);
ISpecification<T> Not();
}
public abstract class LinqSpecification<T> : CompositeSpecification<T>
{
public abstract Expression<Func<T, bool>> AsExpression();
public override bool IsSatisfiedBy(T entity)
{
Func<T, bool> predicate = AsExpression().Compile();
return predicate(entity);
}
}
public abstract class CompositeSpecification<T> : ISpecification<T>
{
public abstract bool IsSatisfiedBy(T entity);
public ISpecification<T> And(ISpecification<T> other)
{
return new AndSpecification<T>(this, other);
}
public ISpecification<T> AndNot(ISpecification<T> other)
{
return new AndSpecification<T>(this, other);
}
public ISpecification<T> Or(ISpecification<T> other)
{
return new OrSpecification<T>(this, other);
}
public ISpecification<T> Not()
{
return new NotSpecification<T>(this);
}
}
public class AndSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> left;
private readonly ISpecification<T> right;
public AndSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left = left;
this.right = right;
}
public override bool IsSatisfiedBy(T candidate)
{
return left.IsSatisfiedBy(candidate) && right.IsSatisfiedBy(candidate);
}
}
public class AndNotSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> left;
private readonly ISpecification<T> right;
public AndNotSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left = left;
this.right = right;
}
public override bool IsSatisfiedBy(T candidate)
{
return left.IsSatisfiedBy(candidate) && right.IsSatisfiedBy(candidate) != true;
}
}
public class OrSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> left;
private readonly ISpecification<T> right;
public OrSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left = left;
this.right = right;
}
public override bool IsSatisfiedBy(T candidate)
{
return left.IsSatisfiedBy(candidate) || right.IsSatisfiedBy(candidate);
}
}
public class NotSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> other;
public NotSpecification(ISpecification<T> other)
{
this.other = other;
}
public override bool IsSatisfiedBy(T candidate)
{
return !other.IsSatisfiedBy(candidate);
}
}
class program
{
static void Main(string[] args)
{
List<Vehicle> VehicleCollection = new List<Vehicle>();
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "1",
Color = "Red",
Price = 15215.32M,
Mileage = 42000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "2",
Color = "Blue",
Price = 50000M,
Mileage = 120000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "3",
Color = "White",
Price = 89000M,
Mileage = 90000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "4",
Color = "Red",
Price = 75000M,
Mileage = 75000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "5",
Color = "White",
Price = 150000M,
Mileage = 15000
});
RedSpecification<Vehicle> Red = new RedSpecification<Vehicle>();
BlueSpecification<Vehicle> Blue = new BlueSpecification<Vehicle>();
WhiteSpecification<Vehicle> White = new WhiteSpecification<Vehicle>();
LowPriceSpecification<Vehicle> lowPrice = new LowPriceSpecification<Vehicle>();
MediumPriceSpecification<Vehicle> mediumPrice = new MediumPriceSpecification<Vehicle>();
HighPriceSpecification<Vehicle> highPrice = new HighPriceSpecification<Vehicle>();
LowMileageSpecification<Vehicle> lowMileage = new LowMileageSpecification<Vehicle>();
MediumMileageSpecification<Vehicle> mediumMileage = new MediumMileageSpecification<Vehicle>();
HighMileageSpecification<Vehicle> highMileage = new HighMileageSpecification<Vehicle>();
}
Pick one of the choices
Continue reading...
Can you please assist?
what is the correct way of searching for a red vehicle with low mileage and a medium price?
public class Vehicle
{
public string RegistrationNumber { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string YearOfManufacture { get; set; }
public string Color { get; set; }
public decimal Price { get; set; }
public int Mileage { get; set; }
public void SendToCollection()
{
Console.WriteLine(RegistrationNumber);
}
}
public class RedSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Color == "Red";
}
}
public class BlueSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Color == "Blue";
}
}
public class WhiteSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Color == "White";
}
}
public class LowPriceSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Price <= 50000 ;
}
}
public class MediumPriceSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Price > 50000 && entity.Price <= 100000;
}
}
public class HighPriceSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Price > 100000;
}
}
public class LowMileageSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Mileage <= 40000;
}
}
public class MediumMileageSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Mileage > 40000 && entity.Price <= 120000;
}
}
public class HighMileageSpecification<T> : CompositeSpecification<T> where T : Vehicle
{
public override bool IsSatisfiedBy(T entity)
{
return entity.Mileage > 120000;
}
}
public interface ISpecification<T>
{
bool IsSatisfiedBy(T entity);
ISpecification<T> And(ISpecification<T> other);
ISpecification<T> AndNot(ISpecification<T> other);
ISpecification<T> Or(ISpecification<T> other);
ISpecification<T> Not();
}
public abstract class LinqSpecification<T> : CompositeSpecification<T>
{
public abstract Expression<Func<T, bool>> AsExpression();
public override bool IsSatisfiedBy(T entity)
{
Func<T, bool> predicate = AsExpression().Compile();
return predicate(entity);
}
}
public abstract class CompositeSpecification<T> : ISpecification<T>
{
public abstract bool IsSatisfiedBy(T entity);
public ISpecification<T> And(ISpecification<T> other)
{
return new AndSpecification<T>(this, other);
}
public ISpecification<T> AndNot(ISpecification<T> other)
{
return new AndSpecification<T>(this, other);
}
public ISpecification<T> Or(ISpecification<T> other)
{
return new OrSpecification<T>(this, other);
}
public ISpecification<T> Not()
{
return new NotSpecification<T>(this);
}
}
public class AndSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> left;
private readonly ISpecification<T> right;
public AndSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left = left;
this.right = right;
}
public override bool IsSatisfiedBy(T candidate)
{
return left.IsSatisfiedBy(candidate) && right.IsSatisfiedBy(candidate);
}
}
public class AndNotSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> left;
private readonly ISpecification<T> right;
public AndNotSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left = left;
this.right = right;
}
public override bool IsSatisfiedBy(T candidate)
{
return left.IsSatisfiedBy(candidate) && right.IsSatisfiedBy(candidate) != true;
}
}
public class OrSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> left;
private readonly ISpecification<T> right;
public OrSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left = left;
this.right = right;
}
public override bool IsSatisfiedBy(T candidate)
{
return left.IsSatisfiedBy(candidate) || right.IsSatisfiedBy(candidate);
}
}
public class NotSpecification<T> : CompositeSpecification<T>
{
private readonly ISpecification<T> other;
public NotSpecification(ISpecification<T> other)
{
this.other = other;
}
public override bool IsSatisfiedBy(T candidate)
{
return !other.IsSatisfiedBy(candidate);
}
}
class program
{
static void Main(string[] args)
{
List<Vehicle> VehicleCollection = new List<Vehicle>();
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "1",
Color = "Red",
Price = 15215.32M,
Mileage = 42000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "2",
Color = "Blue",
Price = 50000M,
Mileage = 120000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "3",
Color = "White",
Price = 89000M,
Mileage = 90000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "4",
Color = "Red",
Price = 75000M,
Mileage = 75000
});
VehicleCollection.Add(new Vehicle()
{
RegistrationNumber = "5",
Color = "White",
Price = 150000M,
Mileage = 15000
});
RedSpecification<Vehicle> Red = new RedSpecification<Vehicle>();
BlueSpecification<Vehicle> Blue = new BlueSpecification<Vehicle>();
WhiteSpecification<Vehicle> White = new WhiteSpecification<Vehicle>();
LowPriceSpecification<Vehicle> lowPrice = new LowPriceSpecification<Vehicle>();
MediumPriceSpecification<Vehicle> mediumPrice = new MediumPriceSpecification<Vehicle>();
HighPriceSpecification<Vehicle> highPrice = new HighPriceSpecification<Vehicle>();
LowMileageSpecification<Vehicle> lowMileage = new LowMileageSpecification<Vehicle>();
MediumMileageSpecification<Vehicle> mediumMileage = new MediumMileageSpecification<Vehicle>();
HighMileageSpecification<Vehicle> highMileage = new HighMileageSpecification<Vehicle>();
}
Pick one of the choices
- A) ISpecification<Vehicle> CarCollection = VehicleCollection.FindAll(x => x.Color == Red && x.Price = mediumPrice && x.Mileage = lowMileage);
- B) ISpecification<Vehicle> CarCollection = Red.And.mediumPrice.And.lowMileage;
- C) ISpecification<Vehicle> CarCollection = Red.Or(lowMileage.Or(mediumPrice));
- D) ISpecification<Vehicle> CarCollection = Red.And(mediumPrice.And(lowMileage));
Continue reading...