在C#中查找两个字符串之间的字符数

Tom*_*mmy 9 c# linq string string-comparison stringcomparer

我正在寻找一个方法,它将采用两个字符串并返回两者共有的字符数,例如:

"G010"和"G1820A"应返回3,因为两者中都存在G,0和1个字符.

如果两个字符都存在两次,则应按如下方式单独计算:

"G12AA"和"GAA2"应返回4,因为两者中都存在G,A,A和2个字符.

对此有何帮助?到目前为止,谷歌搜索并没有太大帮助.

Jod*_*ell 6

好吧,这个怎么样,它具有最大化延迟评估和最小化字符串操作的优势.

public int CommonChars(string left, string right)
{
    return left.GroupBy(c => c)
        .Join(
            right.GroupBy(c => c),
            g => g.Key,
            g => g.Key,
            (lg, rg) => lg.Zip(rg, (l, r) => l).Count())
        .Sum(); 
}
Run Code Online (Sandbox Code Playgroud)

实际上,它通过char对每一侧进行分组,然后找到两侧都有一个组的字符.匹配的组被串联计数,直到任何一个用完.将这些计数相加以产生结果.


对于任何两个序列一般地执行此操作将是微不足道的.见下文,

public static int CommomCount<T>(
        this IEnumerable<T> source,
        IEnumerable<T> sequence,
        IEqualityComparer<T> comparer = null)
{
    if (sequence == null)
    {
        return 0;
    }

    if (comparer == null)
    {
        comparer = EqualityComparer<T>.Default;
    }

    return source.GroupBy(t => t, comparer)
        .Join(
            sequence.GroupBy(t => t, comparer),
            g => g.Key,
            g => g.Key,
            (lg, rg) => lg.Zip(rg, (l, r) => l).Count(),
            comparer)
        .Sum();
}
Run Code Online (Sandbox Code Playgroud)

你会用这个.

"G12AA".CommonCount("GAA2")
Run Code Online (Sandbox Code Playgroud)

comparer如果您需要不区分大小写或其他特殊处理,可选参数可能会很有用.


为了恢复原状,我很想移除Sum()并返回一个IEnumerable<T>,然后在调用中添加总和,就像这样,

public static IEnumerable<T> Commom<T>(
        this IEnumerable<T> source,
        IEnumerable<T> sequence,
        IEqualityComparer<T> comparer = null)
{
    if (sequence == null)
    {
        return Enumerable.Empty<T>();
    }

    if (comparer == null)
    {
        comparer = EqualityComparer<T>.Default;
    }

    return source.GroupBy(t => t, comparer)
        .Join(
            sequence.GroupBy(t => t, comparer),
            g => g.Key,
            g => g.Key,
            (lg, rg) => lg.Zip(rg, (l, r) => l),
            comparer)
        .SelectMany(g => g);
}
Run Code Online (Sandbox Code Playgroud)

所以你可以轻松做到

Console.WriteLine(new string("G12AA".Common("GAA2").ToArray()));
Run Code Online (Sandbox Code Playgroud)

或者只是原始的

"G12AA".Common("GAA2").Count();
Run Code Online (Sandbox Code Playgroud)


rt2*_*800 -3

请检查以下代码--> src 是第一个字符串,而 chk 是第二个字符串

var 计数 = 0;var i=0; src.ToList().ForEach((x)=> {
while(chk.Substring(i).IndexOf(x) >= 0) {
count++; i++; if( i > chk.Length) 中断; }
});

  • 仍然不知道在 194 个答案后如何格式化答案? (3认同)