Ваша структура Dictionary<CarType, Func<List<Car>, int>>
не тот тип, чтобы делать подобные вещи.Вы можете объединить два int
значения, чтобы получить точное число, если попытаетесь объединить типы с перекрывающимися подмножествами.
Вот что я бы сделал:
var CarsRules = new Dictionary<FuelTypes, Func<List<Car>, IEnumerable<Car>>>()
{
{ FuelTypes.Electric, cs => cs.Where(c => c.IsElectric) },
{ FuelTypes.Diesel, cs => cs.Where(c => c.FuelType == FuelTypes.Diesel) },
{ FuelTypes.Gassoline, cs => cs.Where(c => c.FuelType == FuelTypes.Gassoline) },
}
List<Car> cars = new List<Car>()
{
new Car(Guid.NewGuid(), "Tesla", true, FuelTypes.Electric),
new Car(Guid.NewGuid(), "VW", false, FuelTypes.Gassoline),
new Car(Guid.NewGuid(), "Toyota", false, FuelTypes.Gassoline),
new Car(Guid.NewGuid(), "Volvo", false, FuelTypes.Diesel),
};
Console.WriteLine($"Electric: {CarsRules[FuelTypes.Electric](cars).Count()}");
Console.WriteLine($"Gassoline: {CarsRules[FuelTypes.Gassoline](cars).Count()}");
Console.WriteLine($"Diesel: {CarsRules[FuelTypes.Diesel](cars).Count()}");
Console.WriteLine($"Gassoline & Diesel: {CarsRules[FuelTypes.Gassoline](cars).Union(CarsRules[FuelTypes.Diesel](cars)).Count()}");
Для этого необходимо определить следующие типы:
public enum FuelTypes
{
Electric, Gassoline, Diesel
}
public sealed class Car : IEquatable<Car>
{
private readonly Guid _Id;
private readonly string _Name;
private readonly bool _IsElectric;
private readonly FuelTypes _FuelType;
public Guid Id { get { return _Id; } }
public string Name { get { return _Name; } }
public bool IsElectric { get { return _IsElectric; } }
public FuelTypes FuelType { get { return _FuelType; } }
public Car(Guid Id, string Name, bool IsElectric, FuelTypes FuelType)
{
_Id = Id;
_Name = Name;
_IsElectric = IsElectric;
_FuelType = FuelType;
}
public override bool Equals(object obj)
{
if (obj is Car)
return Equals((Car)obj);
return false;
}
public bool Equals(Car obj)
{
if (obj == null) return false;
if (!EqualityComparer<Guid>.Default.Equals(_Id, obj._Id)) return false;
if (!EqualityComparer<string>.Default.Equals(_Name, obj._Name)) return false;
if (!EqualityComparer<bool>.Default.Equals(_IsElectric, obj._IsElectric)) return false;
if (!EqualityComparer<FuelTypes>.Default.Equals(_FuelType, obj._FuelType)) return false;
return true;
}
public override int GetHashCode()
{
int hash = 0;
hash ^= EqualityComparer<Guid>.Default.GetHashCode(_Id);
hash ^= EqualityComparer<string>.Default.GetHashCode(_Name);
hash ^= EqualityComparer<bool>.Default.GetHashCode(_IsElectric);
hash ^= EqualityComparer<FuelTypes>.Default.GetHashCode(_FuelType);
return hash;
}
public override string ToString()
{
return String.Format("{{ Id = {0}, Name = {1}, IsElectric = {2}, FuelType = {3} }}", _Id, _Name, _IsElectric, _FuelType);
}
public static bool operator ==(Car left, Car right)
{
if (object.ReferenceEquals(left, null))
{
return object.ReferenceEquals(right, null);
}
return left.Equals(right);
}
public static bool operator !=(Car left, Car right)
{
return !(left == right);
}
}