在我的程序中,我试图查看用户输入是否等于数据库中的值。但是,用户输入的顺序可能与数据库中的值不同。
例如: 用户输入
A,C,B,E,D,F,G
数据库值
A,B,C,E,F,G,D
因此,当我将用户输入与数据库值进行比较时,即使用户输入具有适当的响应,字符串也不会匹配。我的问题是,是否可以将用户输入与数据库值的所有可能排列进行比较。用户输入和数据库值可以是可变长度的。如果有一个匹配,则显示一个消息框说"正确"。如果没有匹配项,则显示一个消息框,说明"不正确"。
用户输入是字符串,数据库值也是字符串。
感谢您的帮助。
答案 0 :(得分:1)
HashSet
类有一个SetEquals
方法,用于确定两个序列是否代表同一组项目(集合是无序的)。
public static bool SetEquals<T>(this IEnumerable<T> first
, IEnumerable<T> second
, IEqualityComparer<T> comparer = null)
{
comparer = comparer ?? EqualityComparer<T>.Default;
return new HashSet<T>(second).SetEquals(first);
}
答案 1 :(得分:0)
当然最好的方法是让值不在一个字段中,而是在链接表中。
第二个最好的方法是使用split函数(SQL Server中的几个选项)并使用它来模拟链接表,所以你仍然可以加入它。
第三种方式是,不是为了生成所有排列(那里有很多开销),而是用掩码搜索不同的值 e.g。
where ',' + [YourDataBaseField] + ',' like '%,A,%'
AND ',' + [YourDataBaseField] + ',' like '%,C,%'
--etc
',' +[YourDataBaseField] + ','
构造是为了防止必须使用3个语句,一个用于字符串的开头,一个用于内部值,一个用于结束值。
以上假设%
是通配符。
拆分输入字符串以生成sql应该是相当直接的。
答案 2 :(得分:0)
如果您的问题是用户在键入时出错,您可以实施修改后的Levenshtein算法,该算法是为了提高拼写检查准确性而发明的(Damerau-Levenshtein wiki:http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance)。这个算法可以让你编辑两个字符串之间的距离(例如&#34; cat&#34;&#34; kbat&#34;相差两个 - 添加&#34; k&#34;在&#34的开头; cat&#34;并改变&#34; c&#34;到&#34; b&#34;)。尝试编辑成本(例如将相邻交换成本设置为0,将替代成本设置为1等) - 如果数据库中用户类型的字符串和字符串最多相差0和#34;成本&#34; (实验选择)然后你可以认为字符串相等。
答案 3 :(得分:-1)
获取每个输入字符串的哈希码并添加它们。对数据库值执行相同操作。比较两者,如果匹配则所有字段都相同。
String
对象有一个GetHashCode()
方法,可以调用并返回一个整数。