Зачем вам нужна «коллекция и перечисление»? В чем проблема с использованием перечисления Bit Field с атрибутом " Flags " для хранения того, что "Certs" имеет "Person"? Это на самом деле просто более чистая версия варианта 1.
На ваш комментарий, вот очень банальный пример того, о чем я говорю:
class Person
{
public string Name;
public Certifications Certifications;
}
[Flags]
enum Certifications : int
{
A = 1,
B = 2,
C = 4,
D = 8,
E = 16,
F = 32,
G = 64,
H = 128,
I = 256
};
static void Main()
{
Person a = new Person() { Name = "rob", Certifications = Certifications.A | Certifications.D | Certifications.G };
Person b = new Person() { Name = "jeb", Certifications = Certifications.B | Certifications.C | Certifications.I };
// Easy way using [Flags] ToString() override.
DisplayPerson(a);
DisplayPerson(b);
Console.WriteLine();
// Traditional Way
DisplayPersonInfo( a );
DisplayPersonInfo( b );
}
static IEnumerable<string> GetCerts( Person person )
{
foreach( Certifications cert in Enum.GetValues( typeof( Certifications ) ) )
{
if( PersonHasCert( person, cert ) )
yield return ( Enum.GetName( typeof( Certifications ), cert ) );
}
}
static bool PersonHasCert( Person person, Certifications cert )
{
return ( ( cert & person.Certifications ) == cert );
}
static void DisplayPersonInfo( Person p )
{
Console.WriteLine
(
String.Format
(
"Name: {0}, Certifications: {1}",
p.Name,
String.Join( ", ", GetCerts( p ) )
)
);
}
static void DisplayPerson(Person p)
{
Console.WriteLine
(
String.Format
(
"Name: {0}, Certifications: {1}",
p.Name,
p.Certifications
)
);
}
Выход:
Наименование: граб, Сертификаты: A, D, G
Имя: Джеб, Сертификаты: B, C, I
Наименование: граб, Сертификаты: A, D, G
Имя: Джеб, Сертификаты: B, C, I
Вышеупомянутый атрибут «[Flags]» помогает компилятору знать, для чего вы используете эту структуру данных и отображать содержащиеся в ней значения (используя метод ToString () для «Enum» с атрибутом, так что вы не необходимо выполнить итерации Enum и выполнить побитовый тест для каждого значения, когда вы хотите отобразить все значения).
Какие у вас другие оговорки по поводу использования этого подхода? Похоже, что это именно то, что вы хотите достичь, очень эффективно и чисто.
это довольно хорошая статья, освещающая эту тему.
Редактировать 2:
Обновлен пример кода, включающий полный пример программы, использующей оба способа достижения этой функциональности и некоторые вспомогательные методы, которые вы сможете использовать в своем приложении.