获取数组项排列并与数组进行比较

时间:2014-05-05 20:03:18

标签: c# permutation

在我的程序中,我试图查看用户输入是否等于数据库中的值。但是,用户输入的顺序可能与数据库中的值不同。

例如: 用户输入

 A,C,B,E,D,F,G

数据库值

 A,B,C,E,F,G,D

因此,当我将用户输入与数据库值进行比较时,即使用户输入具有适当的响应,字符串也不会匹配。我的问题是,是否可以将用户输入与数据库值的所有可能排列进行比较。用户输入和数据库值可以是可变长度的。如果有一个匹配,则显示一个消息框说"正确"。如果没有匹配项,则显示一个消息框,说明"不正确"。

用户输入是字符串,数据库值也是字符串。

感谢您的帮助。

  • 每个项目都是唯一的

4 个答案:

答案 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()方法,可以调用并返回一个整数。

祝你好运, ž