在c#中,如何构建从A到ZZ的数组,这类似于excel对列进行排序的方式
我正在寻找可以生成数组的代码,其中第一项是A,然后是B,然后是C。在Z之后,它将转到AA,然后AB然后AC。一直到ZZ在c#中,如何构建从A到ZZ的数组,这类似于excel对列进行排序的方式,c#,algorithm,C#,Algorithm,我正在寻找可以生成数组的代码,其中第一项是A,然后是B,然后是C。在Z之后,它将转到AA,然后AB然后AC。一直到ZZ 在C#中执行此操作的最佳方法是什么?请查看并记下字符的值。您应该能够计算出一个循环,将字符从a增加到Z,次数与复制字符的次数相同。:) 您可以使用Enumerable.Range生成数字,并将其强制转换为char以生成A-Z。下一步是将它们组合起来。其中一种方法是: IEnumerable<string> generate() { for (char c =
在C#中执行此操作的最佳方法是什么?请查看并记下字符的值。您应该能够计算出一个循环,将字符从a增加到Z,次数与复制字符的次数相同。:) 您可以使用
Enumerable.Range
生成数字,并将其强制转换为char
以生成A-Z。下一步是将它们组合起来。其中一种方法是:
IEnumerable<string> generate()
{
for (char c = 'A'; c <= 'Z'; c++)
yield return new string(c, 1);
for (char c = 'A'; c <= 'Z'; c++)
for (char d = 'A'; d <= 'Z'; d++)
yield return new string(new[] { c, d });
}
这个是这样的:A,B,…,Z,AA,AB,…,ZZ,AAA,AAB。。。等等:
foreach (var s in generate().Take(200)) Console.WriteLine(s);
在PHP中发现了这一点。这有帮助吗
类程序
{
公共静态字符串IntegerToExcelColumn(int col)
{
//我在这里加了一个256的上限,因为Excel 2003
//仅允许256列。如果正在使用,请更改它
//Excel 2007或2010。
Assert(col>=1&&col=1&&col 26&&col这里有一个方法:
string[]值=
可枚举范围(0,27*26)
.选择(
n=>新字符串(
新[]{(char)('@'+n/26),(char)('A'+n%26)},
n<26?1:0,n<26?1:2
)
)
.ToArray();
弗拉德的伟大回答
这是另一个变化:
static IEnumerable<string> generate() {
for (char c = 'A'; c <= 'Z'; c++) {
yield return c.ToString();
}
foreach (string s in generate()) {
for (char c = 'A'; c <= 'Z'; c++) {
yield return s + c;
}
}
}
静态IEnumerable生成(){
对于(char c='A';c你也可以试试这个.A到ZZ
public class Program
{
public static void Main()
{
int c=1;
string cc=AtoZZ(c);
for(int i=1;i<=702;i++){
cc=AtoZZ(i);
Console.WriteLine(cc);
}
}
static string AtoZZ(int chr)
{
char c1;
char c2;
string alp = "";
if(chr<=26)
{
c1 = (char)(chr + 64);
alp = c1 + "";
}
else
{
int cl1 = chr / 26;
int cl2 = chr % 26;
if(cl2==0){
cl1--;
cl2=26;
}
c1 = (char)(cl1 + 64);
c2 = (char)(cl2 + 64);
alp = c1 + "" + c2;
}
return alp;
}
}
公共类程序
{
公共静态void Main()
{
int c=1;
字符串cc=AtoZZ(c);
对于(int i=1;i,为了补充Vlad的答案,这里是ToBase26(int)的反向操作:
这是如此简单和优雅以至于令人害怕:)我会返回newstring(new[]{c,d})
以秒为单位case@Snowbear:是的,你的方式更优雅,我会改变它。这不是Base 26,因为AA
与A
不同。另请参见其中几个答案也给出了一个反向运算。@Svante:是的,但它非常接近。我同意,这个名称有点误导。(反向运算也很简单。)Linq应该用于使代码可读,而不是使代码LinqishI认为它作为他所要求的函数表达式是完美的。Vlad的外观更好,没错,但只是因为编译器隐藏了它为实现这一点而创建的所有粗糙部分。哇,很好的无限递归用法!我希望我发明了它。它甚至可以很简单r如果将第一个循环替换为justyield return”“;
。
class Program
{
public static string IntegerToExcelColumn(int col)
{
// I've put a 256 upper bound here because Excel 2003
// allows only 256 columns. Change it if you're using
// Excel 2007 or 2010.
Debug.Assert(col >= 1 && col <= 256);
if (col >= 1 && col <= 26)
{
return ((char)(((int)'A') + (col - 1))).ToString();
}
// I've put a 256 upper bound here because Excel 2003
// allows only 256 columns. Change it if you're using
// Excel 2007 or 2010.
if (col > 26 && col <= 256)
{
int rem = col % 26;
int pri = col / 26;
if (rem == 0)
{
rem = 26;
pri--;
}
char[] buffer = new char[2];
buffer[0] = (char)(((int)'A') + (pri - 1));
buffer[1] = (char)(((int)'A') + (rem - 1));
return new string(buffer);
}
return "";
}
static void Main(string[] args)
{
string[] columns= new string[255];
for (int i = 1; i <= 255; i++)
columns[i-1] = IntegerToExcelColumn(i);
foreach(var col in columns)
Console.WriteLine(col);
}
}
string[] values =
Enumerable.Range(0, 27 * 26)
.Select(
n => new String(
new[] { (char)('@' + n / 26), (char)('A' + n % 26) },
n < 26 ? 1 : 0, n < 26 ? 1 : 2
)
)
.ToArray();
static IEnumerable<string> generate() {
for (char c = 'A'; c <= 'Z'; c++) {
yield return c.ToString();
}
foreach (string s in generate()) {
for (char c = 'A'; c <= 'Z'; c++) {
yield return s + c;
}
}
}
static IEnumerable<string> generate() {
yield return "";
foreach (string s in generate()) {
for (char c = 'A'; c <= 'Z'; c++) {
yield return s + c;
}
}
}
public class Program
{
public static void Main()
{
int c=1;
string cc=AtoZZ(c);
for(int i=1;i<=702;i++){
cc=AtoZZ(i);
Console.WriteLine(cc);
}
}
static string AtoZZ(int chr)
{
char c1;
char c2;
string alp = "";
if(chr<=26)
{
c1 = (char)(chr + 64);
alp = c1 + "";
}
else
{
int cl1 = chr / 26;
int cl2 = chr % 26;
if(cl2==0){
cl1--;
cl2=26;
}
c1 = (char)(cl1 + 64);
c2 = (char)(cl2 + 64);
alp = c1 + "" + c2;
}
return alp;
}
}
static long ToBase10(string str)
{
if (string.IsNullOrWhiteSpace(str)) return 0;
var value = str[0] - 'A' + 1;
return (long) (value * Math.Pow(26, str.Length - 1) +
ToBase10(str.Substring(1, str.Length - 1)));
}