如何使用C#检查字符或数字是否仅使用一次?
有效:
abcdef
无效:
aabbccddeeff
使用示例:
string stringToTest = "tteesstt0011";
if (OnlyOnceCheck(stringToTest))
{
throw new Exception("Each character or number can be used only once");
}
答案 0 :(得分:13)
您可以使用LINQ:
public static bool OnlyOnceCheck(string input)
{
return input.GroupBy(x => x).Any(g => g.Count() > 1);
}
或Distinct
:
public static bool OnlyOnceCheck(string input)
{
return input.Distinct().Count() == input.Length;
}
<强>更新强>
如果有人担心表现,您可以随时使用HasSet<char>
:
public static bool OnlyOnceCheck(string input)
{
var set = new HashSet<char>();
return input.Any(x => !set.Add(x));
}
或者如果您担心委托调用开销,可以使用for
循环:
public static bool OnlyOnceCheck(string input)
{
var set = new HashSet<char>();
for (int i = 0; i < input.Length; i++)
if (!set.Add(input[i]))
return false;
return true;
}
但Any()
上的string
做了完全相同的事情......
答案 1 :(得分:2)
您可以使用带有字符作为键的映射(例如hashmap)及其出现的值。如果有任何值> 1然后字符串无效。 或者只是在将键添加到map时,如果它已经存在,则该字符串无效。
在C#中:
static bool OnlyOnceCheck(String str){
Hashtable myHT = new Hashtable();
for (int i=0; i<str.Length; i++){
if (!myHT.ContainsKey(str[i])){
myHT.Add(str[i],1);
} else return true;
}
return false;
}
对不起我的java编码风格,我没有多久使用C#。
答案 2 :(得分:2)
使用Linq:
public static bool OnlyOnceCheck(string input)
{
return input.Distinct().Count() == input.Length
}
答案 3 :(得分:1)
我的贡献:
private bool OnlyOnceCheck(string value){
if (value == null)
return true;
for(int i = 0; i < value.length; i++){
if (value.LastIndexOf(value[i]) != i){
return false;
}
}
return true;
}
答案 4 :(得分:1)
使用正则表达式:
Console.WriteLine(Regex.IsMatch("abcde", @"(.).*\1")); // False
Console.WriteLine(Regex.IsMatch("abcce", @"(.).*\1")); // True
(.)
匹配并捕获任何字符,\1
找到同一字符的其他匹配项。
答案 5 :(得分:0)
使用ToCharArray()
方法将字符串转换为字符数组,然后循环遍历char [] newStr
的值,使用计数器计算每个Char的出现次数。和If ELse
声明以评估您的结果
char [] newStr = stringToTest.ToCharArray();
答案 6 :(得分:0)
更有效的方法是从左到右逐个字符地扫描字符串,计算每个字符代码的每个出现次数。一旦你击中了一个已被计数的角色,你可以拒绝整个弦乐;否则整个字符串都会被扫描,其中的每个字符只出现一次。
真正的问题是确定如何跟踪角色数量。如果字符串可以包含任何字符代码(所有65,536个Unicode字符),那么最好使用整数计数的哈希表,由字符代码索引/键入。
另一方面,如果您知道该字符串只包含相当小的字符子集(例如,从'\ u0000'到'\ u00FF'的ISO 8859-1 Latin-1代码),那么您可以使用一个小整数数组来保存计数器。