0

我有一个如下所示的后端表,我正在使用 ado.net 阅读它。

我试图将其转换为具有键值对的字典,但我不知道如何映射键和值,以便在阅读时code 1可以返回其类别名称,而当我将 2code 3作为子代码阅读时,我可以同时阅读其对应的类别和子类别?(例如,旧的,三个月的)。

是否有任何其他类型/类可用于实现此功能?

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
4

2 回答 2

2

您有多种选择,具体取决于您需要对数据执行的操作、数据更改的频率等。一些明显的选择是:

嵌套类型

创建一个自定义类型来保存您的类别及其子类别。这样做的好处是,如果没有子类别,您可以跳过子类别,并且您的数据类型可以准确地映射到您的业务对象。

public class Category 
{
  public int Id;
  public string Name;
  Dictionary<int, string> Subcategories = new Dictionary<int, string>();
}

Dictionary<int, Category> Categories;

(我也会考虑 a KeyedCollectionhere 可以直接Id从 aCategory作为键提取。)

缺点:添加或检索子类别需要更多工作,因为您必须进行两次查找:

var subcategory = Categories[1].Subcategories[1];

一个 4 元组(四元组?)

如果您的数据结构很少更改,您可以使用 4-field 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 有点乱,那时我会选择一个自定义类。

拆分集合

将类别名称和子类别拆分为单独的集合:一个包含类别 id -> 名称映射,另一个包含类别 id -> 子类别映射:

Dictionary<id, string> CategoryNames;
Dictionary<id, Dictionary<id, string>> Subcatgories;

这比Tuple解决方案更灵活,但不涉及自定义数据类型,因此它是一个更“快速和肮脏”的解决方案。此外,如果您通常发现自己关心其中一个,那么将数据分开可能会使事情变得更有效率。

于 2012-06-11T15:05:20.533 回答
0

您也可以使用 Dictionary 作为主字典的值。因此,您将使用 dict[category][sub] 访问您的数据

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

于 2012-06-11T14:58:14.187 回答