Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有特殊字符的C#单词排列_C#_.net_Permutation - Fatal编程技术网

具有特殊字符的C#单词排列

具有特殊字符的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<

我正在尝试创建单词“password”的排列,我已经用下面的代码创建了单词的所有排列。目前,这不包括大写和小写。我需要包括具有特殊字符的排列,例如,我将在哪里使用“p@ssword". 其中,我将“a”替换为“@”和“o”“0”

知道如何扩展我的实现吗

 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(零),既然我已经在更改字符的大小写,我该如何将其包含到我的新值中。我该如何在已经存在的迭代中更改大小写?对于每个可用的选项,运行相同的代码。。