C#中的LINQ SequenceEquals扩展出现问题

本文关键字:问题 扩展 SequenceEquals 中的 LINQ | 更新日期: 2023-09-27 18:20:34

我正在尝试使用以下逻辑检查字符串是否为回文的可能性

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Anagram solver");
        Console.WriteLine(IsPalindrome("HIMA", "AMHI").ToString());
        Console.ReadKey();
    }
    static bool IsPalindrome(string s1, string s2)
    {
        return s1.OrderBy(c => c).SequenceEqual(s2.OrderBy(c => c));
    }
}

我的想法是获得一个字符串中的字符文字,并与另一个字符串的字符文字进行比较,以推断出可能的回文。LINQ SequenceEqual方法有可能做到这一点吗?

从上面的样本来看,

'H' shall be compared with 'A'  (default equality comparison)  
'I' shall be compared with 'M'
'M' shall be compared with 'H'    
'A' shall be compared with 'I'

有人能带我到这儿来吗。

谢谢和干杯Srivatsa

C#中的LINQ SequenceEquals扩展出现问题

如果你想要回文,那么你不应该对它们进行排序,只需要反转并匹配-

static bool IsPalindrome(string s1, string s2)
{
    return s1.SequenceEqual(s2.Reverse());
}

不区分大小写的尝试-

static bool IsPalindrome(string s1, string s2)
{
    return s1.ToLower().SequenceEqual(s2.ToLower().Reverse());
}

在您的情况下,"HIMA"answers"AMHI"按OrderBy LINQ函数排序,这会产生两个包含字符"AHIM"的集合。如果调用SequenceEqual,则返回true。

为了使SequenceEqual返回true,两个集合必须具有完全相同顺序的相同数量的元素。任何元素都不允许复制或存储在其他位置。

如果你想确定两个单词是否是变位词,这正是你想要的功能。

对于回文,您可以使用以下内容:

public bool CheckPalindrome(string first, string second)
{
    if (first == null) throw new ArgumentNullException("first");
    if (second == null) throw new ArgumentNullExcpetion("second");
    return first.Reverse().SequenceEquals(second);
}

您可以使用以下方法:

public static bool IsPalindromWith(this string str1, string str2)
{
    if(str1 == null || str2 == null) return false;
    return str1.SequenceEqual(str2.Reverse());
}

用法:bool isPalindrom = "HIMA".IsPalindromWith("AMIH");

然而,这是一种非常简单的方法,忽略了许多边缘情况。


这里有一个更好的版本,至少考虑到了这种情况:

public static bool IsPalindromWith(this string str1, string str2, StringComparison comparison = StringComparison.CurrentCultureIgnoreCase)
{
    if(str1 == null || str2 == null) return false;
    char[] str2Chars = str2.ToCharArray();
    Array.Reverse(str2Chars);
    return str1.Equals(new String(str2Chars), comparison);
}

通过@feO2x 对现有(我的意见是正确的)答案进行详细说明

试着这样看:

   static bool IsAnagram(string s1, string s2)
    {
        var lst1  = s1.OrderBy(c => c); //will result in { 'A','H','I', 'M' }
        var lst2 = s2.OrderBy(c => c); //will *also* result in { 'A','H','I', 'M' }
        return lst1.SequenceEqual(lst2);
    }

OrderBy(...)会破坏您尝试测试的原始订单。

简单地移除它们将解决您的问题:

   static bool IsAnagram(string s1, string s2)
    {
        var lst1  = s1.AsEnumerable(); 
        var lst2 = s2.AsEnumerable(); 
        return lst1.SequenceEqual(lst2);
    }