比较两个或多个字符在两个字符串中是否不同

时间:2015-09-25 06:40:06

标签: c# string char compare

我想比较两个或多个字符在两个字符串中是否不同。 例如

var string1 = "test1" 
var string2 = "trsz1"

现在我想检查一下,如果> = 2个字符在这2个字符串中有所不同,则应该输出false。 你会怎么做?

4 个答案:

答案 0 :(得分:0)

该算法称为Levenshtein距离

public static int ComputeLevenshteinDistance(string strA, string strB)
{
    if (string.IsNullOrEmpty(strA) || string.IsNullOrEmpty(strB))
    {
        return Math.Max(strA == null ? 0 : strA.Length, strB == null ? 0 : strB.Length);
    }
    int[,] iArray = new int[strA.Length + 1, strB.Length + 1];
    for (int i = 0; i <= strA.Length; i++)
    {
        iArray[i, 0] = i;
    }
    for (int i = 0; i <= strB.Length; i++)
    {
        iArray[0, i] = i;
    }
    int iCost;
    int[] iMin = new int[3];
    for (int i = 1; i <= strA.Length; i++)
    {
        for (int j = 1; j <= strB.Length; j++)
        {
            iCost = (strA[i - 1] == strB[j - 1]) ? 0 : 1;
            iMin[0] = iArray[i - 1, j] + 1;
            iMin[1] = iArray[i, j - 1] + 1;
            iMin[2] = iArray[i - 1, j - 1] + iCost;
            iArray[i, j] = iMin.Min();
        }
    }
    return iArray[strA.Length, strB.Length];
}

所以你可以做..

string string1 = "test1" ;
string string2 = "trsz1";

bool IsDifferent = ComputeLevenshteinDistance(string1, string2) >= 2;

ComputeLevenshteinDistance计算将string1转换为string2所需的更改次数。如果你想把扭曲计算为一个变化你需要Damerau Levenshtein距离

答案 1 :(得分:0)

如果字符串的长度始终相同,则非常简单:

var count = 0;
for(var i = 0; i < string1.Length; i++)
{
  if(string1[i] != string2[i]) count++;
}
return count < 2;

答案 2 :(得分:0)

  

但现在我想比较字符串以将它们排序为false或true

如果你的字符串大小相同,你可以试试这个:

var string1 = "test1";
var string2 = "trsz1";

var result = string1.Zip(string2, (f, s) => f == s ? true : false).ToList();
//result: true, false, true, false, true

var ifTwoOrMoreDifferent = result.Count(i => i == false) > 1;

如果您的输入大小不同,那么您的最后一行可能会修改如下:

var lengthDif = Math.Abs(string1.Length-string2.Length);
var ifTwoOrMoreDifferent = result.Count(i => i == false) + lengthDif > 1;

答案 3 :(得分:0)

var string1 = "test1" ;
var string2 = "trsz1";

string1.Zip(string2, (x, y) =>  x.Equals(y)).Where(c=>!c).Count() >= 2


Console.WriteLine(string1.Zip(string2, (x, y) =>  x.Equals(y)).Where(c=>!c).Count() >= 2);  

您还应该了解zip约束/限制。

  

该方法逐步执行两个输入序列,应用函数   resultSelector到两个序列的相应元素。该   method返回由返回的值的序列   resultSelector。 如果输入序列的数量不同   元素,该方法组合元素,直到它到达一个结束   序列。例如,如果一个序列有三个元素和   另一个有四个,结果序列只有三个元素。

工作Demo