首先,这是用于模式匹配的,所以请记住,因为它可能有一个完全不同的解决方案,我想听听它。
我有这一系列数据(现在我们称之为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 = *
然而,似乎它会有很大的开销,速度对此很重要,另外树不是二进制的,也需要处理通配符。
答案 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的大小。