【问题标题】:How to limit searching characters if I use LINQ如果我使用 LINQ,如何限制搜索字符
【发布时间】:2011-03-12 22:38:05
【问题描述】:

我有一个函数可以在文本中返回重复(出现 2 次或更多次)字符。我用 LINQ 来做:

 public char[] linq(string text)
    {            
        char[] result = text
            .GroupBy(x => x)
            .Where(g => g.Count() > 1)
            .Select(g => g.Key).ToArray();
        return result;
    }  

但是这种方式会返回文本(字符串)中所有字符的重复出现。如何限制搜索,如果我只想搜索英文字母字符:abcdefghi....等。 感谢您的帮助。

【问题讨论】:

  • 感谢所有,但解决我的问题的答案已被删除(顺便说一下,两个第一个答案很有帮助。非常感谢。
  • 当我注意到您提到只需要 English 字母表中的字符时,我删除了我的答案。 Char.IsLetter 匹配任何 Unicode 字母类别中的字符。
  • 是的,我也注意到了。但它也可以使用,所以还是谢谢你)。

标签: c# linq string search character


【解决方案1】:

这样的?

linq("and a rhino 11", new char[] { 'a', 'b', 'c' }); // result: { 'a' }

public char[] linq(string text, char[] limitChars)
{
    char[] result = text
        .Where( c => limitChars.Contains(c))
        .GroupBy(x => x)
        .Where(g => g.Count() > 1)
        .Select(g => g.Key)
        .ToArray();
    return result;
}  

此解决方案仅适用于您需要将字符范围限制为 可配置 列表的情况。

请注意,char.IsLetter() 方法也会允许其他字母(即西里尔文、希腊文等)中的字符通过,因此这可能并不理想。

不传递可配置列表的下一个最好的事情是@Femaref 的解决方案 imo 明确使用英文字母的字符代码 - 这可能最适合您的特定问题。

【讨论】:

  • 非常感谢。我认为这很有帮助。
【解决方案2】:

看起来 char.IsLetter() 是你想要的:char.IsLetter()

【讨论】:

    【解决方案3】:

    这就是你需要的。

    //http://msdn.microsoft.com/en-us/library/system.char.isletter.aspx

    private static void Main(string[] args)
    {
        Console.WriteLine(linq(@"szuizu_4156424324_hjvlahsjlvhlkd_&&§"));
        Console.Read();
    }
    
    public static char[] linq(string text)
    {
        char[] result = text
                    .Where(Char.IsLetter)
                    .GroupBy(x => x)
                    .Where(g =>g.Count() > 1)
                    .Select(g => g.Key).ToArray();
    
        return result;
    }
    

    【讨论】:

    • 谢谢,我已经解决了我的问题。您不是用户吗,写了类似“只需在您的 GroupBy 之前添加 Where(Char.IsLetter)”并删除该答案吗?
    • Thanx 这是个好方法,但它允许所有 Unicode 字母。就我而言,我需要更窄的解决方案,b/c 我需要在英文字母表中搜索重复的字符。
    • 没错,正如 Femaref 指出的那样,您可以使用 "c >= 65 && c = 97 && c
    【解决方案4】:
        char[] result = text
            .GroupBy(x => x)
            .Where(g => g.Count() > 1 && (g.Key >= 65 && g.Key <= 122))
            .Select(g => g.Key).ToArray();
    

    来自 cmets 的更新:

        char[] result = text
            .GroupBy(x => x)
            .Where(g => g.Count() > 1 && ((g.Key >= 65 && g.Key <= 90) || (g.Key >= 97 && g.Key <= 122)))
            .Select(g => g.Key).ToArray();
    

    【讨论】:

    • 只是一个旁注,但您必须分解字符代码范围以排除 65-122 范围内的特殊字符。例如。 "c >= 65 && c = 97 && c
    • 哦,组之间有特殊字符吗?没看出来,看了一眼。
    猜你喜欢
    • 2023-01-27
    • 1970-01-01
    • 2012-09-24
    • 2023-01-11
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2014-02-07
    • 2013-10-22
    相关资源
    最近更新 更多