不同字符串长度的C#anagrams?

时间:2014-01-01 21:25:56

标签: c# string linq lambda anagram

public static bool IsAnagramOf(this string word1, string word2)
{
    return word1.OrderBy(x => x).SequenceEqual(word2.OrderBy(x => x));
}

我目前正在从包含所有英文单词的大型xml文件中提取所有内容。然后我将每个单词与给定的字符串进行比较,看看它是否是一个字谜。我然后存储每个正确的单词并返回它们。

...然而

我想要这样做,因此字谜不必具有相同的字符串长度。

例如:“Hello”包含“Hello”,“Hell”,“He”等......

有没有这样做的代码相对较小?

谢谢!

编辑:所以包括subanagrams以及相等长度的字谜。

2 个答案:

答案 0 :(得分:3)

也许你的方法应该被称为ContainsTheSameSetOfLetters

public static bool ContainsTheSameSetOfLetters(this string word1, string word2)
{
    var chars = new HashSet<char>(word1);
    return word2.All(x => chars.Contains(x));
}

如果您关心使用特定字母的时间,您可以使用以下内容:

public static bool ContainsTheSameSetOfLetters(string word1, string word2)
{
    var chars = word1.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());
    return word2.GroupBy(x => x).All(g => chars.ContainsKey(g.Key) && chars[g.Key] >= g.Count());
}

答案 1 :(得分:0)

尝试创建一个检查序列以另一个序列开始的扩展方法,而不是使用SequenceEqual。