【问题标题】:Get unused chars in string?获取字符串中未使用的字符?
【发布时间】:2016-06-10 12:34:43
【问题描述】:

我对编程真的很陌生,我刚刚开始学习 C# 的一些基础知识。我只是尝试编写一个方法来检查字符串中是否不包含某些特殊字符。我的结果是这段代码:

static string GetUnused(string s)
{
    /*
     *  Propably will get confused if s contains '#' char... how2fix?
     */
    char[] signs = { '!', '§', '$', '%', '&', '/', '(', ')', '=', '?' };
    foreach (char c in s)
    {
        if (c == '!') signs[0] = '#';
        if (c == '§') signs[1] = '#';
        if (c == '$') signs[2] = '#';
        if (c == '%') signs[3] = '#';
        if (c == '&') signs[4] = '#';
        if (c == '/') signs[5] = '#';
        if (c == '(') signs[6] = '#';
        if (c == ')') signs[7] = '#';
        if (c == '=') signs[8] = '#';
        if (c == '?') signs[9] = '#';
    }
    string ret = string.Empty;
    foreach (char x in signs)
    {
        if (x == '#') ret += "";
        else ret += x;
    }
    return ret;

但我很确定这不是解决我的问题的好方法......我该如何以更优雅的方式解决这个问题? 感谢您的回答。

【问题讨论】:

标签: c# string chars


【解决方案1】:

你可以使用Except:

private static string GetUnused(string s)
{
    char[] signs = {'!', '§', '$', '%', '&', '/', '(', ')', '=', '?'};
    var ret = signs.Except(s);
    return String.Join("",ret);
}

【讨论】:

  • OP 选择的问题,signs 现在可以是这些字符中的string,即return string.Join("", "!§$%&/()=?".Except(s))
  • 我认为string.Concat.Join 更干净stackoverflow.com/a/11654221/360211 虽然new String(ret.ToArray()) 也是一种选择,而且它更快,而且可以说同样干净。
【解决方案2】:

如果您将标志存储为list<char>,您可以使用RemoveAll 删除方法参数中存在的任何项目,如下所示:

static string getunused(string param)
{
    list<char> signs = new list<char>(){ '!', '§', '$', '%', '&', '/', '(', ')', '=', '?' };
    signs.removeall(c => param.contains((c.tostring())));
    return new string(signs.toarray());
}

【讨论】:

    【解决方案3】:

    另一个答案

    static string GetUnused(string s)
    {
        char[] signs = { '!', '§', '$', '%', '&', '/', '(', ')', '=', '?' };
        var set = new HashSet<char>(signs);
    
        foreach (char c in s)
            set.Remove(c);
    
        return string.Concat(set);
    }
    

    HashSet 非常快。

    如果输入参数可以非常大,那么下一个版本会更有利可图,在某些情况下

    static string GetUnused(string s)
    {
        char[] signs = { '!', '§', '$', '%', '&', '/', '(', ')', '=', '?' };
        var set = new HashSet<char>(signs);
    
        foreach (char c in s)
        {
            set.Remove(c);
            if (set.Count == 0)
                return string.Empty;
        }
        return string.Concat(set);
    }
    

    【讨论】:

    • 建议你看看Except的实现(提示,它使用了一个集合)
    猜你喜欢
    • 2014-12-13
    • 2019-07-22
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多