使用LINQ比较两个字符串中的字符序列

本文关键字:字符串 字符 两个 比较 LINQ 使用 | 更新日期: 2023-09-27 18:19:04

我有两个字符串:-字符串s1 = "TEST";string s2 = "ASDTFGHEJKLSIOPT";

现在,如果我们仔细观察字符串s1在字符串s2中的字符序列,我们发现s2包含来自s1的所有字符,它们在相同的序列中,但索引不同。

我想要一个解决方案(如果可能的话使用LINQ或使用最小复杂度的数组解决方案),如果字符串包含来自另一个字符串的所有字符在相同序列中,无论其索引如何,则返回true,否则它应该返回false。

使用LINQ比较两个字符串中的字符序列

你可以这样做:

string s1 = "TEST"; string s2 = "ASDTFGHEJKLSIOPT";
//Will return all the matching characters without loosing their sequence
var matchingString = new string(s2.Where(r => s1.Contains(r)).ToArray());
if (matchingString.Contains(s1))
{
    //found
}
else
{
    //not found
}

这将确保匹配字符串是否包含相同序列的s1,而不考虑索引。

Linq Aggregate方法可用于此目的:

public static class TextHelper
{
    public static bool ContainsInterspersed(this string outer, string inner)
    {
        if (outer == null || inner == null)
            throw new ArgumentNullException();
        return ((IEnumerable<char>)inner).Aggregate(0, (nextIndex, ch) =>
            {
                nextIndex = (nextIndex < 0 ? nextIndex : outer.IndexOf(ch, nextIndex));
                if (nextIndex >= 0)
                    nextIndex++;
                return nextIndex;
            }) >= 0;
    }
}

这两个字符串的长度是线性的。此方法不创建任何数组或子字符串。