我想轻松预先填充单个字符串数组,我将其称为“字母”,其值为:
AAAAAA
AAAAAB
AAAAAC
AAAAAD
..
..
ZZZZZX
ZZZZZY
ZZZZZZ
按顺序提供1.65亿种组合。
我的想法是,我需要能够要求6个字符的任何特定组合,例如BBCHHJ
和使用Array.Index
来返回它所在的数组元素。
我有点第二位:
String searchFor;
Console.Write("Enter a string value to search for: ");
searchFor = Console.ReadLine();
int indexValue = Array.IndexOf(letters, searchFor);
Console.WriteLine("The value you are after is in element index: " + indexValue);
Console.ReadLine();
但我不知道如何按顺序使用所有这些组合轻松初始化字母数组!
答案 0 :(得分:3)
Jakub的答案的变化应该更高效:
int result = s
.Select(c => c - 'A') // map 'A'-'Z' to 0-25
.Aggregate(0, (total, next) => total * 26 + next); // calculate the base 26 value
这样做的好处是可以避免使用Reverse
和单独的Sum
,并且在每次迭代中都不必从头开始计算26的幂。
答案 1 :(得分:1)
在数组中存储3.08亿个元素并搜索它们不是最佳解决方案,而是在运行时计算索引。我创建了一个代码示例:
string input = "ZZZZZZ";
//default values
string alphabets_s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] alphabets = alphabets_s.ToCharArray();
int result = 1; //starting with "one" because zero will make everything zero
//calculating index
for (int i = 0; i < input.Length; i++)
{
//get character index and add "1" to avoid multiplication with "0"
int index = Array.IndexOf(alphabets, input[i]) + 1;
//multiply it with the current result
result *= index;
}
//subtract 1 from final result, because we started it with 1
result--;
PS:我做了基本的测试,如果您发现任何问题,请通知我。
答案 2 :(得分:0)
正如我在评论中所写的那样,你想要达到的目标基本上是从26号码转换。
第一步是将字符串转换为数字列表。然后乘以26的幂并加在一起:
var s = "AAAABB";
var result = s
.Select(c => c - 'A') //map characters to numbers: A -> 0, B -> 1 etc
.Reverse() //reverse the sequence to have the least significant digit first
.Select((d, i) => d * Math.Pow(26, i))
.Sum();