带有通配符的真值表(ish)

时间:2012-08-15 21:41:53

标签: c# pattern-matching

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

我有这一系列数据(现在我们称之为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#的人更新。

为什么我这样做?因为当前的代码变得难以跟随和更新(如果是,则嵌套太多,否则如果),到目前为止仅描述了几个“类型”(它将在几个月内翻倍)。

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

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

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

1 个答案:

答案 0 :(得分: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”,它有两个成员,“键入一个字符串”和“键入b字符串”,还有一个用于a = *的集合,它有一个成员,“输入m string“。

如果您试图找到与a =“abc”,b =“xxx”和c = true的字符串匹配的值,则需要取a =“abc”和a =的交点* set,将它与b =“xxx”和b = 的并集相交,然后将其与c = true和c = 的并集相交。然后,您将拥有一组与您的密钥匹配的值。

它将在O([a =“abc”] + [a = *] + [b =“xxx”] + [b = *] + [c = true] + [c = *])=为O(n)

当然,O(n)只是迭代所有规则来检查匹配,但是在这里我们大大减小了n的大小。