首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个字符串中的字符

比较两个字符串中的字符
EN

Stack Overflow用户
提问于 2011-10-25 01:49:04
回答 7查看 25.8K关注 0票数 1

在C#中,如何比较两个字符串中的字符。

例如,假设我有这两个字符串

"bc3231dsc“和"bc3462dsc”

我如何通过编程计算出这些字符串

都以"bc3“开头,以"dsc”结尾?

所以给定的是两个变量:

代码语言:javascript
复制
var1 = "bc3231dsc";  
var2 = "bc3462dsc";  

在比较了从var1到var2的每个字符之后,我希望输出是:

代码语言:javascript
复制
leftMatch = "bc3";  
center1 = "231";  
center2 = "462";  
rightMatch = "dsc";  

条件:

代码语言:javascript
复制
 1. The strings will always be a length of 9 character.
 2. The strings are not case sensitive.
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-10-25 03:01:22

代码语言:javascript
复制
    static void Main(string[] args)
    {
        string test1 = "bc3231dsc";
        string tes2 = "bc3462dsc";
        string firstmatch = GetMatch(test1, tes2, false);
        string lasttmatch = GetMatch(test1, tes2, true);
        string center1 = test1.Substring(firstmatch.Length, test1.Length -(firstmatch.Length + lasttmatch.Length)) ;
        string center2 = test2.Substring(firstmatch.Length, test1.Length -(firstmatch.Length + lasttmatch.Length)) ;

    }

    public static string GetMatch(string fist, string second, bool isReverse)
    {
        if (isReverse)
        {
            fist = ReverseString(fist);
            second = ReverseString(second);
        }
        StringBuilder builder = new StringBuilder();
        char[] ar1 = fist.ToArray();
        for (int i = 0; i < ar1.Length; i++)
        {
            if (fist.Length > i + 1 && ar1[i].Equals(second[i]))
            {
                builder.Append(ar1[i]);
            }
            else
            {
                break;
            }
        }
        if (isReverse)
        {
            return ReverseString(builder.ToString());
        }
        return builder.ToString();
    }

    public static string ReverseString(string s)
    {
        char[] arr = s.ToCharArray();
        Array.Reverse(arr);
        return new string(arr);
    }
票数 1
EN

Stack Overflow用户

发布于 2011-10-25 01:52:12

string类有两个方法(StartsWith和Endwith)可供使用。

票数 5
EN

Stack Overflow用户

发布于 2011-10-25 20:01:32

在阅读了您的问题和已经给出的答案后,我认为缺少一些限制,这些限制对您来说可能是显而易见的,但对社区来说却不是。但也许我们可以做一些猜测的工作:

  1. 您将有一堆要比较的字符串对。
  2. 每对中的两个字符串具有相同的长度,或者您只对从左到右同时读取的字符进行比较才感兴趣。
  3. 获取某种枚举,它告诉我每个块的开始位置和长度。

由于字符串只是字符的枚举,您可以在这里使用LINQ来了解匹配的字符,如下所示:

代码语言:javascript
复制
private IEnumerable<bool> CommonChars(string first, string second)
{
    if (first == null)
        throw new ArgumentNullException("first");

    if (second == null)
        throw new ArgumentNullException("second");

    var charsToCompare = first.Zip(second, (LeftChar, RightChar) => new { LeftChar, RightChar });
    var matchingChars = charsToCompare.Select(pair => pair.LeftChar == pair.RightChar);

    return matchingChars;
}

这样我们就可以继续下去了,现在我们可以用这个方法找出每个连续的true和false标志块有多长:

代码语言:javascript
复制
private IEnumerable<Tuple<int, int>> Pack(IEnumerable<bool> source)
{
    if (source == null)
        throw new ArgumentNullException("source");

    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            yield break;
        }

        bool current = iterator.Current;
        int index = 0;
        int length = 1;

        while (iterator.MoveNext())
        {
            if(current != iterator.Current)
            {
                yield return Tuple.Create(index, length);
                index += length;
                length = 0;
            }

            current = iterator.Current;
            length++;
        }

        yield return Tuple.Create(index, length);
    }
}

目前我不知道是否有一个已经存在的LINQ函数提供了相同的功能。据我所知,使用SelectMany()应该是可行的(因为从理论上讲,你可以用这个方法完成任何LINQ任务),但作为一个临时实现,上面的实现(对我来说)更容易。

然后,可以按如下方式使用这些函数:

代码语言:javascript
复制
var firstString = "bc3231dsc";
var secondString = "bc3462dsc";

var commonChars = CommonChars(firstString, secondString);
var packs = Pack(commonChars);

foreach (var item in packs)
{
    Console.WriteLine("Left side:  " + firstString.Substring(item.Item1, item.Item2));
    Console.WriteLine("Right side: " + secondString.Substring(item.Item1, item.Item2));
    Console.WriteLine();
}

然后你会给出下面的输出:

左侧: bc3右侧: bc3

左侧: 231右侧: 462

左侧: dsc右侧: dsc

最大的缺点是,在某种程度上,Tuple的使用导致了丑陋的属性名称Item1Item2,这些属性名称很难立即阅读。但如果真的需要,你可以引入自己的简单类,包含两个整数,并有一些坚如磐石的属性名称。此外,目前还丢失了关于每个块是否由两个字符串共享或它们是否不同的信息。但同样,将此信息也放入元组或您自己的类中应该是相当简单的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7879636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档