Получить неиспользованные символы в строке?

Я действительно новичок в программировании, и я только начал и изучил некоторые основы для 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;

но я почти уверен, что это не хорошее решение моей проблемы... Как мне решить эту проблему более элегантно? Спасибо за ответ.

3 ответа

Решение

Вы могли бы использовать Except:

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

Если вы сохранили знаки как 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());
}

Еще один ответ

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);
}
Другие вопросы по тегам