c#检查两个字符串是否包含相同的字符
我创建了3个c#检查两个字符串是否包含相同的字符,c#,string,compare,C#,String,Compare,我创建了3个字符串: string a = "abcdgfg"; string b = "agbfcd"; string c = "axcvn"; 我想创建以下支票,但找不到如何创建: 需要检查字符串a和字符串b中是否有相同的latter(不要在意顺序,或者如果后者显示多次,只需要检查两个字符串上是否出现相同的latter)。 然后我需要对字符串a和字符串c执行相同的检查 正如您所看到的:字符串a和字符串b具有相同的Latter,字符串a和字符串c没有 在我做了检查后,我只需打印一个按摩,如果
字符串
:
string a = "abcdgfg";
string b = "agbfcd";
string c = "axcvn";
我想创建以下支票,但找不到如何创建:
需要检查字符串a
和字符串b
中是否有相同的latter(不要在意顺序,或者如果后者显示多次,只需要检查两个字符串上是否出现相同的latter)。
然后我需要对字符串a
和字符串c
执行相同的检查
正如您所看到的:字符串a
和字符串b
具有相同的Latter,字符串a
和字符串c
没有
在我做了检查后,我只需打印一个按摩,如果字符串有相同的或没有后者
有人能告诉我怎么做支票吗
编辑:
勾选“a”和“c”后,o应打印出现的第一个后一个,并且“a”和“c”之间不匹配
谢谢我建议使用a,它是:
顺便说一句,这也可以取代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());
}
使用
除
+任何
之外的原始答案有一个微妙的错误。如果存在重复项,则检查长度是不够的。因此,您需要从两个方向进行检查,或者首先使用Distinct
。与作为O(n)操作的HashSet.SetEquals
-方法相比,这两种方法效率都很低
bool abSame = !a.Except(b).Any() && !b.Except(a).Any();
需要检查字符串a和字符串b中是否有相同的latter(不要在意顺序,或者如果后者显示多次,只需要检查两个字符串上是否出现相同的latter)
您可以这样做:
bool same = a.Distinct().OrderBy(c => c)
.SequenceEqual(b.Distinct().OrderBy(c => c));
这只是对两个字符串的字符进行排序,并检查两个有序序列是否相等。你可以对
a
和c
使用相同的方法,那么“或者如果后者显示了不止一次”位呢?效率有点低,不是吗?@TimSchmelter对于大字符串,可能是:)你的第一个想法奏效了,我建议使用字符串扩展,而不是使用HashSet(我甚至都不熟悉)。可以在没有长度检查的情况下思考你的第一个想法(因为你说它有bug)。。。我也写了我的第一篇文章,你也能帮我吗?:)@user3396397:仅当您使用时它才有效!除了两侧的+任何
,长度检查是不够的。考虑A是<代码>“AAA”< /代码>和B<代码>“AB”< /代码>。code>HashSet.SetEquals可读性更强,效率更高。现在我了解了HashSet
的功能,这对我来说很好,谢谢:)你能帮我做一下eddit吗?在勾选“a”和“c”之后,它应该打印出现的后一个,并且“a”和“c”之间不匹配@user3396397:我已经编辑了我的答案。您可以使用SymmetricExceptWith
查找两个字符串之一中缺少的所有字符。您甚至可以首先使用它,然后检查aSet.Any()
。这将取代SetEquals
检查。
private bool HaveSameLetters(string a, string b)
{
return a.All(x => b.Contains(x)) && b.All(x => a.Contains(x));
}
bool same = a.Distinct().OrderBy(c => c)
.SequenceEqual(b.Distinct().OrderBy(c => c));
private bool HaveSameLetters(string a, string b)
{
return a.All(x => b.Contains(x)) && b.All(x => a.Contains(x));
}