我应该使用哪种类型/类来映射不同的值?

时间:2012-06-11 14:52:14

标签: c# .net

我有一个后端表,如下所示,我正在使用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

2 个答案:

答案 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元组(四元组?)

如果您的数据结构很少更改,您可以使用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作为主词典的值。因此,您将使用访问您的数据     字典[类别] [分]

另一种选择是使用元组作为键,将主键和辅助键“编码”为一个唯一键