2

首先,这是用于模式匹配的,所以请记住这一点,因为您可能有一个完全不同的解决方案,我想听听。

我有这一系列数据(我们暂时称它为 mystring)。

string a = get_starting_letters(mystring)
string b = get_ending_letters(mystring)
bool c = check_code_appears(mystring)
.
.
.
and so on

我想要一个像这样工作的字典/真值表(* 表示通配符)。

key  (a,b,c...)               value

"abc", *, True     =   "type a string"
"abc", "xyz", True =   "type b string"
*, "xyz", True     =   "type m string"

这如何在 C# 中实现?我知道这对于 F# 来说是非常微不足道的,但是这个代码将来可能会被只知道 C# 的人更新。

我为什么要这样做?因为当前的代码变得难以遵循和更新(嵌套的 if、else、else if 太多),并且到目前为止只描述了几个“类型”(它将在几个月内翻倍)。

我一直在考虑的其他解决方案:一种树/结构,描述了由条件检查的不同可能变量:

                      b = "xyz"
           a = "abc" <
mystring <            b = "xxx"
           a = "cda" <
                      b = *

然而,它似乎会产生很大的开销,并且速度对此很重要,此外,树不会是二进制的,并且也需要处理通配符。

4

1 回答 1

1

如果您只需要能够检查给定元组是否与给定类型匹配,那么您可以只使用常规字典,例如

Dictionary<string, Tuple<string, string, bool>> lookup = new Dictionary<string, Tuple<string, string, bool>>();

//add some values
lookup["type a string"] = new Tuple<string, string, bool>("abc", null, true);
lookup["type b string"] = new Tuple<string, string, bool>("abc", "xyz", true);
lookup["type m string"] = new Tuple<string, string, bool>(null, "xyz", true);

然后,您只需查找要检查匹配的类型,以查看值是否相等(或者元组中是否存在空值)。

如果您需要能够确定字符串匹配哪些类型(并且不想迭代已知类型),那么显然这种方法不起作用......但您需要建立某种类型优先规则以及...

更新:一种方法是使用 SQL 并添加一些索引(如果您不想编写自己的基于 B 树的索引)。是的,它是基于磁盘的,但是如果你经常引用它,表可能会被缓存,如果你不这样做,就没有理由担心性能。

一个更简单的想法是使用排序集。内存效率不是很高,但可能足够快,具体取决于您的规则设置方式。您将为每个字段的每个可能值构造一个集合,其中包含类型字符串。例如,你有一个集合,其中 a="abc",它有两个成员,"type a string" 和 "type b string",还有一个集合 a=*,它只有一个成员,"键入 m 字符串”。

如果您试图查找与 a="abc"、b="xxx" 和 c=true 的字符串匹配的值,您将采用 a="abc" 和 a=* 集的交集,将它与 b="xxx" 和 b=的并集相交,然后与 c=true 和 c= 的并集相交。然后,您将拥有一组与您的键匹配的值。

它将运行在 O([a="abc"] + [a=*] + [b="xxx"] + [b=*] + [c=true] + [c=*]) = O(n )

当然,它 O(n) 只是遍历所有规则以检查匹配项,但在这里我们大大减少了 n 的大小。

于 2012-08-16T01:33:45.460 回答