返回第一个不匹配索引的c#字符串比较方法

返回第一个不匹配索引的c#字符串比较方法,c#,string-matching,C#,String Matching,是否存在一种现有的字符串比较方法,该方法将根据两个字符串之间首次出现的不匹配字符返回值 i、 e 我想返回一个值,该值允许我看到匹配中断的第一次出现是[8]一个沿着以下行的扩展方法可以完成这项工作: public static int Your_Name_Here(this string s, string other) { string first = s.Length < other.Length ? s : other; string second = s.Leng

是否存在一种现有的字符串比较方法,该方法将根据两个字符串之间首次出现的不匹配字符返回值

i、 e


我想返回一个值,该值允许我看到匹配中断的第一次出现是[8]

一个沿着以下行的扩展方法可以完成这项工作:

public static int Your_Name_Here(this string s, string other) 
{
    string first = s.Length < other.Length ? s : other;
    string second = s.Length > other.Length ? s : other;

    for (int counter = 0; counter < first.Length; counter++)
    {
        if (first[counter] != second[counter])
        {
            return counter;
        }
    }
    return -1;
}
public static在此处输入您的名称(此字符串为s,字符串为other)
{
第一个字符串=s.长度<其他长度?s:其他;
字符串秒=s.长度>其他长度?s:其他;
for(int counter=0;计数器
//
///获取第一个不同的字符出现索引
/// 
///第一串
///二线
/// 
///如果为true,则返回第一次出现的索引,即使字符串长度不同
///相同长度的部分等于-1
/// 
/// 
///返回第一个差异索引,如果未找到差异,则返回-1
/// 
public int GetFirstBreakIndex(字符串a、字符串b、布尔handleLengthDifference)
{
int equalReturnCode=-1;
if(String.IsNullOrEmpty(a)| | String.IsNullOrEmpty(b))
{
返回handleLengthDifference?0:equalsReturnCode;
}
字符串最长=b.长度>a.长度?b:a;
字符串缩短=b.长度>a.长度?a:b;
for(int i=0;i
据我所知,这并不重要,但它非常简单:

public static int FirstUnmatchedIndex(this string x, string y)
{
  if(x == null || y == null)
    throw new ArgumentNullException();
  int count = x.Length;
  if(count > y.Length)
    return FirstUnmatchedIndex(y, x);
  if(ReferenceEquals(x, y))
    return -1;
  for(idx = 0; idx != count; ++idx)
    if(x[idx] != y[idx])
      return idx;
  return count == y.Length? -1 : count;
}

这是一个简单的顺序比较。顺序不区分大小写的比较是一个简单的改变,但是文化基础很难定义;“Weißbier”与第二个字符串中最后一个S上的“WEISSBIERS”不匹配,但这算是位置8还是位置9?

如果安装了.net 4.0,这可能是一种方式:

    string A = "1234567890";
    string B = "1234567880";

    char? firstocurrence = A.Zip(B, (p, q) => new { A = p, B = q })
        .Where(p => p.A != p.B)
        .Select(p => p.A)
        .FirstOrDefault();
编辑:

但是,如果您需要该职位:

    int? firstocurrence = A.Zip(B, (p, q) => new { A = p, B = q })
            .Select((p, i) => new { A = p.A, B = p.B, idx = i })
            .Where(p => p.A != p.B)
            .Select(p => p.idx)
            .FirstOrDefault();

可以像这样编写字符串扩展名

public static class MyExtensions
{
    public static IList<char> Mismatch(this string str1, string str2)
    {
        var char1 = str1.ToCharArray();
        var char2 = str2.ToCharArray();
        IList<Char> Resultchar= new List<char>();
        for (int i = 0; i < char2.Length;i++ )
        {
            if (i >= char1.Length || char1[i] != char2[i])
                Resultchar.Add(char2[i]);
        }
        return Resultchar;
    }
}
这不是一个寻找不匹配的优化算法

如果您只想找到第一个不匹配项

public static Char FirstMismatch(this string str1, string str2)
        {
            var char1 = str1.ToCharArray();
            var char2 = str2.ToCharArray();             
            for (int i = 0; i < char2.Length;i++ )
            {
                if (i >= char1.Length || char1[i] != char2[i])
                    return char2[i];
            }
            return ''c;
        }
public static Char FirstMismatch(此字符串str1,字符串str2)
{
var char1=str1.ToCharArray();
var char2=str2.ToCharArray();
for(int i=0;i=char1.Length | | char1[i]!=char2[i])
返回char2[i];
}
返回“c”;
}


本主题是的一个副本,其中包含使用Linq的更好的一行解决方案

正在滚动您自己的解决方案,不可能(也许)作为扩展方法?+1首先检查标准库中是否已存在此问题。完全。更糟糕的是,当您意识到它从1.1开始就在框架中时,对完善一个非常好的实现的自豪感就会下降!如果
other
s
短,会发生什么情况?它轰炸:)公正的评论,会修改吗名字很糟糕-下面的@sllReturns首选答案为false-如果长字符串以短字符串开头,则为1。“abc”与字符3上的“abcdef”不匹配(字符“abc”根本没有),但返回-1表示匹配。此答案应在多年前删除。如果字符串不同,但长度相同,则
first
second
都将分配给s,返回值将为-1。嘿。。。我们都这么做。。。所以应该集成在线编译器;)@奥德说它“微不足道”,这对我来说是正确的。是的,但每个答案的初稿都有不完善之处。你为什么选择a.Equals(b)
而不是a==b?如果
a
为空,代码将中断。对equals的调用将迭代整个字符串,直到第一次中断为止(不包括快捷方式),然后再迭代整个字符串。我会调用
ReferenceEquals
作为一条捷径,但忽略了
Equals
的其余部分,因为它的工作无论如何都会重复。现在“abc”等于null?或者建议另一种方法,null不匹配其第一个字符的null?@Jon:现在null被视为零长度字符串,因此当启用
handleLengthDifference
时,可以在0索引处作为差处理。如果a等于b,则返回-1,并且必须返回a或b的长度,不是吗?这不是问题中的要求。如果两个字符串的长度不一样,那么事后检查就很容易了,因为要找到“abc12343234”与“abcdefghijk”不匹配的位置,首先需要做一些事情来回答这个问题。LINQ是不正确的,由于where子句,它总是返回位置0。Zip后面的对应结尾是:.Select((x,idx)=>(item:x,idx))。其中(x=>x.item.expected!=x.item.actual)。Select(x=>x.idx)。FirstOrDefault();
public static class MyExtensions
{
    public static IList<char> Mismatch(this string str1, string str2)
    {
        var char1 = str1.ToCharArray();
        var char2 = str2.ToCharArray();
        IList<Char> Resultchar= new List<char>();
        for (int i = 0; i < char2.Length;i++ )
        {
            if (i >= char1.Length || char1[i] != char2[i])
                Resultchar.Add(char2[i]);
        }
        return Resultchar;
    }
}
var r = "1234567890".Mismatch("1234567880");
public static Char FirstMismatch(this string str1, string str2)
        {
            var char1 = str1.ToCharArray();
            var char2 = str2.ToCharArray();             
            for (int i = 0; i < char2.Length;i++ )
            {
                if (i >= char1.Length || char1[i] != char2[i])
                    return char2[i];
            }
            return ''c;
        }