Я бы предложил пойти по тому же маршруту, что и вы, т.е.
Dictionary<Tuple<string, string, string>, Tuple<string, string, string>>
С новым ValueTuple
вы можете использовать более лаконичный синтаксис, чтобы сделать это
var tbl = new Dictionary<(string, string, string), (string, string, string)>();
var newVal = tbl[("Hardware", "Display", "Request upgrade")];
Вы также можете использовать имена для полей кортежей, как показано ниже:
var tbl = new Dictionary<(string Cat, string SubCat, string SubSubCat), (string Cat, string SubCat, string SubSubCat)>();
Если вам нужна большая гибкость, контроль или функции, вы можете использовать класс для этого, как показано ниже
class CatInfo : Tuple<string, string, string> {
public string Category => Item1;
public string SubCategory => Item2;
public string SubSubCategory => Item3;
public CatInfo(string cat, string subCat, string subSubCat) : base(cat, subCat, subSubCat) { }
}
Если дляпо какой-то причине вы не можете создать подкласс от Tuple
или хотите получить чуть более высокую производительность, тогда вы можете просто создать неизменяемую структуру, как показано ниже
struct CatInfo {
public string Category { get; }
public string SubCategory { get; }
public string SubSubCatergory { get; }
public CatInfo(string cat, string subCat, string subSubCat) {
Category = cat;
SubCategory = subCat;
SubSubCatergory = subSubCat;
}
public bool Equals(CatInfo other) {
return string.Equals(Category, other.Category) && string.Equals(SubCategory, other.SubCategory) && string.Equals(SubSubCatergory, other.SubSubCatergory);
}
public override bool Equals(object obj) {
if (obj is null)
return false;
return obj is CatInfo info && Equals(info);
}
public override int GetHashCode() {
unchecked {
int hashCode = (Category != null ? Category.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (SubCategory != null ? SubCategory.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (SubSubCatergory != null ? SubSubCatergory.GetHashCode() : 0);
return hashCode;
}
}
public static bool operator ==(CatInfo info1, CatInfo info2) {
return info1.Equals(info2);
}
public static bool operator !=(CatInfo info1, CatInfo info2) {
return !(info1 == info2);
}
}