c#检查2个字符串是否包含相同的字符

时间:2014-08-22 13:01:06

标签: c# string compare

我创建了3 strings

string a = "abcdgfg";
string b = "agbfcd";
string c = "axcvn";

我想创建以下检查,但我无法了解如何: 需要检查在string astring b中是否存在相同的后置者(更不用说顺序或者如果后者显示多次,只需检查两个字符串上是否出现相同的后者)。 然后我需要对string astring c执行相同的检查。

正如您所看到的那样:string astring b具有相同的后置者,stringa astring c没有。

在我进行检查后,如果琴弦具有相同的后者,我只需打印按摩

有谁能告诉我如何进行咀嚼?

修改

检查“a”和“c”后,它应该打印出第一个后来出现的“a”和“c”之间不匹配

由于

3 个答案:

答案 0 :(得分:4)

我建议使用HashSet<T>并使用SetEquals

var aSet = new HashSet<char>(a);
var bSet = new HashSet<char>(b);
bool abSame = aSet.SetEquals(b);

修改

  

在检查“a”和“c”之后,它应该打印出来的第一个后者   “a”和“c”之间不匹配

然后您可以使用HashSet.SymmetricExceptWith

if (!abSame)
{
    aSet.SymmetricExceptWith(bSet);
    Console.WriteLine("First letter that is either in a and not in b or in b and not in a: " + aSet.First()); 
}

顺便说一句,这也可以取代SetEquals支票:

aSet.SymmetricExceptWith(bSet); // removes all characters which are in both
if (aSet.Any())                 // missing charaters in one of both strings
{
    Console.WriteLine("First letter that is either in a and not in b or in b and not in a: " + aSet.First()); 
}

使用Except + Any的原始答案有一个微妙的错误。如果有重复,检查长度是不够的。因此,您需要从两个方向进行检查或首先使用Distinct。与作为O(n)操作的HashSet.SetEquals - 方法相比,这两种方法都是低效的。

bool abSame = !a.Except(b).Any() && !b.Except(a).Any();

答案 1 :(得分:4)

private bool HaveSameLetters(string a, string b)
{       
     return a.All(x => b.Contains(x)) && b.All(x => a.Contains(x));
}

答案 2 :(得分:2)

  

需要检查字符串a和字符串b中是否存在相同的后者(不要介意顺序或后者显示多次,只需要检查后者是否出现在同一个字符串中)。

你可以这样做:

bool same = a.Distinct().OrderBy(c => c)
           .SequenceEqual(b.Distinct().OrderBy(c => c));

这只是对两个字符串的字符进行排序,并检查两个有序序列是否相等。您可以对ac使用相同的方法。