Честно, enum
не является решением для этого. Ближайшей аналогией с вашей «проверкой совместимости», вероятно, будет EqualityComparer<T>
в .NET. Это отдельный класс.
Сравнение «совместимы с двумя людьми» действительно не принадлежит классу Person. Это зависит от того, какую меру совместимости вы сравниваете, и со временем это сравнение может измениться, или вы можете добавить другие сопоставители совместимости.
Итак, вместо enum
создайте класс CompatibilityComparer
. На данный момент это имеет один метод .IsCompatible(Person a, Person b)
, и внутри этого метода вы можете использовать словарь, поиск базы данных, сложный расчет на основе взвешенных значений из a и b или любого другого, что вы хотите.
private static readonly CompatibilityComparer comparer
= new CompatibilityComparer();
...
if (comparer.IsCompatible(john, krystal)) ...
См separation of concerns и single responsibility principle.
В идеале ваш компаратор также будет работать на интерфейсе IPerson
, а не на конкретном классе Person
, чтобы вы могли легче его протестировать с помощью mock IPerson
объектов.
Простейший пример, используя словарь совместимых людей может быть:
Dictionary<int, int[]> matrix = new Dictionary<int, int[]>();
// You could initialize this statically, or better yet, use Lazy<>
static CompatibilityComparer()
{
matrix[1] = new[] { 2, 4 };
...
}
public bool IsCompatible(Person a, Person b)
{
return matrix[a.Id].Contains(b.Id);
}
Вы также можете представить ваш график совместимости в виде списка пара совместимых людей идентификаторов, как 2D квадратной матрицы, или любые другое представление графика.
Если у вас действительно есть все Person
объекты в памяти, статически определить, было бы лучше иметь Dictionary<Person, List<Person>>
, хотя в какой-то момент один должен спросить, «что реальная среда здесь?», Это не интересная проблема пока не будет тысяч людей, и они находятся в базе данных, а затем нужен другой подход.
Как была выбрана «совместимость»? а) человеком, вводящим данные в базу данных или б) некоторым алгоритмом? Если первое, то это будет включать в себя идентификаторы и таблицу совместимости в базе данных с двумя внешними ключами назад к таблице людей (например, словарь предназначен для иллюстрации). И если последнее, почему это не так в коде?
Вы можете показать, как выглядит ваш фактический enum, почему вы не сравниваете значения Enums. Возможно, эта ссылка может помочь пролить свет на то, как сравнивать значения Enum http://stackoverflow.com/questions/19537083/ c-sharp-enum-how-to-compare-value – MethodMan