获取字符串中未使用的字符?
Get unused chars in string?
我真的是编程新手,我刚刚开始学习 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;
但我很确定这不是解决我的问题的好方法...我该如何以更优雅的方式解决这个问题?
感谢您的回答。
您可以使用 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);
}
我真的是编程新手,我刚刚开始学习 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;
但我很确定这不是解决我的问题的好方法...我该如何以更优雅的方式解决这个问题? 感谢您的回答。
您可以使用 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);
}