我有一个后端表,如下所示,我正在使用ado.net阅读它。
我尝试将其转换为具有键值对的字典,但我不知道如何映射键和值,以便在阅读code 1
时我可以返回其类别名称,当我读取2时作为子代码code 3
,我可以读取其对应的类别和子类别吗?(比如说,Old,ThreeMonth)。
是否有其他类型/类可用于实现此功能?
code Sub_Code Category Sub_Category
1 1 NEW NEW
2 1 Old OneMonth
2 2 Old TwoMonth
2 3 Old ThreeMonth
2 4 Old Ninemonth
5 4 APPOINTMENT APPOINTMENT MADE
9 4 Invalid LANGUAGE BARRIER
答案 0 :(得分:2)
您有多种选择,具体取决于您需要对数据执行的操作,更改频率等。一些明显的选项是:
创建自定义类型以保存您的类别及其子类别。如果没有子类别,则可以跳过子类别,并且您的数据类型可以精确映射到业务对象。
public class Category
{
public int Id;
public string Name;
Dictionary<int, string> Subcategories = new Dictionary<int, string>();
}
Dictionary<int, Category> Categories;
(我还考虑KeyedCollection
这里可以直接从Id
中提取Category
作为关键字。)
缺点:添加或检索子类别需要做更多工作,因为你必须进行两次查找:
var subcategory = Categories[1].Subcategories[1];
如果您的数据结构很少更改,您可以使用4字段Tuple<>
:
List<Tuple<int, int, string, string>> Categories;
var subcategory = Categories.Where(x => Item1 == 1 && Item2 == 1);
这里最大的缺点是它没有很好地编入索引。通过使用两个Tuples
(一个键,一个值),您可以以更复杂的代价来减轻这一点:
Dictionary<Tuple<int, int>, Tuple<string, string>> Categories;
但IMO变得有点凌乱,那时候我会选择一个自定义类。
将类别名称和子类别拆分为单独的集合:一个包含cateogory id - &gt;名称映射,另一个包含类别ID - &gt;子类别映射:
Dictionary<id, string> CategoryNames;
Dictionary<id, Dictionary<id, string>> Subcatgories;
这比Tuple
解决方案更灵活,但不涉及自定义数据类型,因此它是一个更“快速和肮脏”的解决方案。此外,如果您经常发现自己仅关心其中一个,那么将数据分开可能会提高效率。
答案 1 :(得分:0)
您也可以使用Dictionary作为主词典的值。因此,您将使用访问您的数据 字典[类别] [分]
另一种选择是使用元组作为键,将主键和辅助键“编码”为一个唯一键