我有两个名为sln和csln的字符串变量,我想将它们转换为char数组,然后比较它们之间使用的字符
string value = sln;
char[] X = value.ToCharArray();
string valueY = csln;
char[] Y = valueY.ToCharArray();
由于某种原因,我不明白为什么它不起作用
比较他们使用
if (X.SequenceEqual(Y))
{
}
但要检查这是否有效,第一个必须正常工作,我必须将它们转换为字符,我必须将X的每个字符与Y的相应字符进行比较,以使这两个数组的相似性达到百分比,请帮忙
答案 0 :(得分:0)
例如,如果您想检查每个字符
,您可以通过这种方式比较数组string value = "assdf";
char[] X = value.ToCharArray();
string valueY = "assdf";
char[] Y = valueY.ToCharArray();
if (X.Count() == Y.Count())
{
int arrayLenght = X.Count();
Console.WriteLine("Ok, Array is same lenght ... lets check the content");
for (int i = 0; i < arrayLenght; i++)
{
if (X[i] != Y[i])
{
Console.WriteLine("Not the same array!");
}
}
}
else
{
Console.WriteLine("Array is not equal in lenght");
}
Console.ReadKey();
答案 1 :(得分:0)
一般来说,在.NET中会有很长的路要走 - 字符串实际上是char []。因此,不要将字符串转换为char数组,只需访问它们就像它们是一个数组一样(因为它们是)。
这是吉姆的例子被修改为使用这个概念......
string valueX = "assdf";
string valueY = "assdf";
if (valueX.Length == valueY.Length)
{
Console.WriteLine("Ok, Array is same lenght ... lets check the content");
for (int i = 0; i < valueX.Length; i++)
{
if (valueX[i] != valueY[i])
{
Console.WriteLine("Not the same array!");
}
}
}
else
{
Console.WriteLine("Array is not equal in lenght");
}
此外,如果您没有具体说明如何进行比较,string.Equal会让您陷入麻烦。区分大小写,文化敏感?阅读本文以获取更多信息...
http://msdn.microsoft.com/en-us/library/c64xh8f9(v=vs.110).aspx
因为听起来你正在寻找LCS(最长公共子串)或Levenshtein距离算法,所以看一下......
http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Longest_common_substring#C.23
答案 2 :(得分:0)
看起来你需要在每个字符串中匹配值和位置的字符数。因此,可以Zip
将字符串组合在一起,而不是计算相同字符的Tuple
:
var same = sln.Zip(csln, (c1,c2)=> Tuple.Create(c1,c2))
.Where(t => t.Item1 == t.Item2)
.Count();
var percentage = 100.0 * same / sln.Count();
请注意,要计算百分比,您需要将至少一个元素强制转换为float
,否则对于匹配数量较少的长字符串(200个中的1个),您可能会得到0。
答案 3 :(得分:0)
现在我们折磨你的时间已经足够长,无法发现你的任务,我可以给你答案。
根本不需要将字符串转换为字符数组,因为字符串本身提供了模仿这种数组的接口。
static void Main(string[] args)
{
string a = Console.ReadLine();
string b = Console.ReadLine();
int max = Math.Max(a.Length, b.Length);
int min = Math.Min(a.Length, b.Length);
// dividing integer by integer will return integer
// therefore durign division you need to indicate need for floating point value
// or just use float type, cheap trick, but it works just as well and makes code cleaner
float c = 0;
// for each character up to end of shorter string
for (int i=0; i<min; i++)
{
// compare them
if (a[i] == b[i])
{
// and if equal, increase counter
c++;
}
}
Console.WriteLine("Similarity is {0:P}", c / max);
Console.ReadLine();
}