具有特殊字符的C#单词排列
我正在尝试创建单词“password”的排列,我已经用下面的代码创建了单词的所有排列。目前,这不包括大写和小写。我需要包括具有特殊字符的排列,例如,我将在哪里使用“p@ssword". 其中,我将“a”替换为“@”和“o”“0” 知道如何扩展我的实现吗具有特殊字符的C#单词排列,c#,.net,permutation,C#,.net,Permutation,我正在尝试创建单词“password”的排列,我已经用下面的代码创建了单词的所有排列。目前,这不包括大写和小写。我需要包括具有特殊字符的排列,例如,我将在哪里使用“p@ssword". 其中,我将“a”替换为“@”和“o”“0” 知道如何扩展我的实现吗 public static void WritePermutations(string pwd) { pwd = pwd.ToLower(); var myDict = new Dictionary<
public static void WritePermutations(string pwd)
{
pwd = pwd.ToLower();
var myDict = new Dictionary<int, string>();
int Count = 0;
var results =
from e in Enumerable.Range(0, 1 << pwd.Length)
let p =
from b in Enumerable.Range(0, pwd.Length)
select (e & (1 << b)) == 0 ? (char?)null : pwd[b]
select string.Join(string.Empty, p);
foreach (string s in results)
{
string newValue = pwd;
s.ToLower();
foreach (char c in s)
{
var Old = c.ToString().ToLower();
var New = c.ToString().ToUpper();
newValue = ReplaceFirstOccurrence(newValue, Old, New);
Count++;
}
myDict.Add(Count, newValue);
}
foreach (var cred in myDict)
{
Console.WriteLine(cred.Value);
}
}
public static string ReplaceFirstOccurrence(string Source, string Find, string Replace)
{
int Place = Source.IndexOf(Find);
string result = Source.Remove(Place, Find.Length).Insert(Place, Replace);
return result;
}
publicstaticvoidwritepermutations(字符串pwd)
{
pwd=pwd.ToLower();
var myDict=新字典();
整数计数=0;
var结果=
从Enumerable.Range(0,1中的e开始,从以下声明和函数开始:
List<HashSet<char>> _charCombinations = new List<HashSet<char>> {
new HashSet<char> {'a','@'},
new HashSet<char> {'o', '0'},
};
HashSet<char> GetAlternatives(char c)
{
var result = new HashSet<char>();
foreach (var hashSet in _charCombinations)
{
if (hashSet.Contains(c))
{
foreach (char c2 in hashSet)
result.Add(c2);
}
}
if (char.IsLetter(c))
{
result.Add((String.Empty + c).ToUpper()[0]);
result.Add((String.Empty + c).ToLower()[0]);
}
else if (false) // any other char.Is-based logic
{
}
result.Add(c);
return result;
}
IEnumerable<string> GetTransformations(string s, int start)
{
char c = s[start - 1];
foreach (var c2 in GetAlternatives(c))
{
if (start == s.Length)
yield return String.Empty + c2;
else
{
var e = GetTransformations(s, start + 1).GetEnumerator();
while (e.MoveNext())
yield return c2 + e.Current;
}
}
}
List\u charcombines=新列表{
新哈希集{'a','@'},
新哈希集{'o',0'},
};
HashSet GetAlternations(字符c)
{
var result=new HashSet();
foreach(var hashSet in_charcombines)
{
if(hashSet.Contains(c))
{
foreach(哈希集中的字符c2)
结果:添加(c2);
}
}
if(字符(c))
{
Add((String.Empty+c).ToUpper()[0]);
结果.Add((String.Empty+c).ToLower()[0]);
}
else if(false)//任何其他基于char.Is的逻辑
{
}
结果.添加(c);
返回结果;
}
IEnumerable GetTransformation(字符串s,int start)
{
字符c=s[start-1];
foreach(GetAlternations(c)中的var c2)
{
如果(开始==s.Length)
收益率返回字符串。空+c2;
其他的
{
var e=GetTransformations(s,start+1).GetEnumerator();
while(如MoveNext())
屈服返回c2+e.电流;
}
}
}
然后,您可以这样使用它们:
var e = GetTransformations("password", 1).GetEnumerator();
var result = new List<string>();
while (e.MoveNext())
result.Add(e.Current);
result.Sort((a,b) => string.CompareOrdinal(a, b));
var e=GetTransformations(“密码”,1).GetEnumerator();
var result=新列表();
while(如MoveNext())
结果。添加(e.当前);
result.Sort((a,b)=>string.CompareOrdinal(a,b));
这将产生576个字符串(太长,无法在此处列出),这正是8个字母的单词所期望的,其中6个字符有2种可能,另外2个有3种可能,即2x2x2x3x3从以下声明和函数开始如何:
List<HashSet<char>> _charCombinations = new List<HashSet<char>> {
new HashSet<char> {'a','@'},
new HashSet<char> {'o', '0'},
};
HashSet<char> GetAlternatives(char c)
{
var result = new HashSet<char>();
foreach (var hashSet in _charCombinations)
{
if (hashSet.Contains(c))
{
foreach (char c2 in hashSet)
result.Add(c2);
}
}
if (char.IsLetter(c))
{
result.Add((String.Empty + c).ToUpper()[0]);
result.Add((String.Empty + c).ToLower()[0]);
}
else if (false) // any other char.Is-based logic
{
}
result.Add(c);
return result;
}
IEnumerable<string> GetTransformations(string s, int start)
{
char c = s[start - 1];
foreach (var c2 in GetAlternatives(c))
{
if (start == s.Length)
yield return String.Empty + c2;
else
{
var e = GetTransformations(s, start + 1).GetEnumerator();
while (e.MoveNext())
yield return c2 + e.Current;
}
}
}
List\u charcombines=新列表{
新哈希集{'a','@'},
新哈希集{'o',0'},
};
HashSet GetAlternations(字符c)
{
var result=new HashSet();
foreach(var hashSet in_charcombines)
{
if(hashSet.Contains(c))
{
foreach(哈希集中的字符c2)
结果:添加(c2);
}
}
if(字符(c))
{
Add((String.Empty+c).ToUpper()[0]);
结果.Add((String.Empty+c).ToLower()[0]);
}
else if(false)//任何其他基于char.Is的逻辑
{
}
结果.添加(c);
返回结果;
}
IEnumerable GetTransformation(字符串s,int start)
{
字符c=s[start-1];
foreach(GetAlternations(c)中的var c2)
{
如果(开始==s.Length)
收益率返回字符串。空+c2;
其他的
{
var e=GetTransformations(s,start+1).GetEnumerator();
while(如MoveNext())
屈服返回c2+e.电流;
}
}
}
然后,您可以这样使用它们:
var e = GetTransformations("password", 1).GetEnumerator();
var result = new List<string>();
while (e.MoveNext())
result.Add(e.Current);
result.Sort((a,b) => string.CompareOrdinal(a, b));
var e=GetTransformations(“密码”,1).GetEnumerator();
var result=新列表();
while(如MoveNext())
结果。添加(e.当前);
result.Sort((a,b)=>string.CompareOrdinal(a,b));
这将产生576个字符串(太长,无法在此列出),这正是您对8个字母的单词所期望的,其中6个字符有2种可能,另外2个有3种可能,即使用的每个字母(PASWORD)都有2x2x2x3x3,制作一系列备选方案。通过所有combinations@BugFinder我不确定我是否理解,所以我创建了一个带有特殊字符(可选字符)的数组?选择是无止境的,但是是的,为每个字符创建一个数组来替换它,并用其中可以包含的可选字符填充它,所以,o可能会得到o,ó,0,o,()…好的,在我的例子中,只有两个字符,可选a=@和o=0(零),既然我已经在更改字符的大小写,我该如何将其包含到我的新值中。我该如何在已经存在的迭代中更改大小写?针对每个可用选项,运行相同的代码..对于使用的每个字母(PASWORD),制作一系列备选方案。通过所有combinations@BugFinder我不确定我是否理解,所以我创建了一个带有特殊字符(可选字符)的数组?选择是无止境的,但是是的,为每个字符创建一个数组来替换它,并用其中可以包含的可选字符填充它,所以,o可能会得到o,ó,0,o,()…好的,在我的例子中,只有两个字符,可选a=@和o=0(零),既然我已经在更改字符的大小写,我该如何将其包含到我的新值中。我该如何在已经存在的迭代中更改大小写?对于每个可用的选项,运行相同的代码。。