在C#中,如何比较两个字符串中的字符。
例如,假设我有这两个字符串
"bc3231dsc“和"bc3462dsc”
我如何通过编程计算出这些字符串
都以"bc3“开头,以"dsc”结尾?
所以给定的是两个变量:
var1 = "bc3231dsc";
var2 = "bc3462dsc"; 在比较了从var1到var2的每个字符之后,我希望输出是:
leftMatch = "bc3";
center1 = "231";
center2 = "462";
rightMatch = "dsc"; 条件:
1. The strings will always be a length of 9 character.
2. The strings are not case sensitive.发布于 2011-10-25 03:01:22
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);
}发布于 2011-10-25 01:52:12
string类有两个方法(StartsWith和Endwith)可供使用。
发布于 2011-10-25 20:01:32
在阅读了您的问题和已经给出的答案后,我认为缺少一些限制,这些限制对您来说可能是显而易见的,但对社区来说却不是。但也许我们可以做一些猜测的工作:
由于字符串只是字符的枚举,您可以在这里使用LINQ来了解匹配的字符,如下所示:
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标志块有多长:
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任务),但作为一个临时实现,上面的实现(对我来说)更容易。
然后,可以按如下方式使用这些函数:
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的使用导致了丑陋的属性名称Item1和Item2,这些属性名称很难立即阅读。但如果真的需要,你可以引入自己的简单类,包含两个整数,并有一些坚如磐石的属性名称。此外,目前还丢失了关于每个块是否由两个字符串共享或它们是否不同的信息。但同样,将此信息也放入元组或您自己的类中应该是相当简单的。
https://stackoverflow.com/questions/7879636
复制相似问题