在C#中,我如何构建一个类似于Excel列顺序的从A到ZZ的数组?

26 浏览
0 Comments

在C#中,我如何构建一个类似于Excel列顺序的从A到ZZ的数组?

我正在寻找一个能生成数组的代码,其中第一个项目是A,然后是B,再然后是C...接着Z,然后是AA,再然后是AB,再然后是AC...一直到ZZ

在C#中,如何最好地实现这个目标?

0
0 Comments

问题出现的原因是因为用户想要在C#中按照Excel中列的排序方式来建立一个从A到ZZ的数组。在Excel中,列的排序方式是从A到Z,然后是AA到AZ,然后是BA到BZ,以此类推。用户希望能够在C#中实现类似的排序方式。

解决方法是首先使用Enumerable.Range生成数字,然后将数字转换为对应的字符来生成A到Z的序列。接下来的步骤是将这些字符组合起来,以生成从A到ZZ的数组。

下面是实现这个方法的代码示例:

using System;
using System.Linq;
public class Program
{
    public static void Main()
    {
        int totalColumns = 26 * 26; // ZZ
        // Generate numbers from 0 to totalColumns
        var numbers = Enumerable.Range(0, totalColumns);
        // Convert numbers to corresponding characters (A to Z)
        var characters = numbers.Select(number => (char)(number % 26 + 'A'));
        // Combine characters to form column names (A to ZZ)
        var columnNames = characters.SelectMany(firstChar => characters.Select(secondChar => $"{firstChar}{secondChar}"));
        // Print the column names
        foreach (var columnName in columnNames)
        {
            Console.WriteLine(columnName);
        }
    }
}

运行以上代码,将会输出从A到ZZ的所有列名。

0
0 Comments

问题的出现原因是:提问者想要在C#中构建一个类似于Excel中列排序方式的从A到ZZ的数组。

解决方法是:使用C#的yield关键字和递归函数来生成字符数组。首先,可以定义一个静态的generate函数,返回一个IEnumerable类型。在这个函数中,可以使用for循环来遍历从'A'到'Z'的字符,然后使用yield return语句将每个字符转换为字符串返回。接下来,在generate函数中使用foreach循环来遍历调用generate函数的结果,并在内部的for循环中再次遍历从'A'到'Z'的字符。在内部的for循环中,将调用generate函数的结果与当前字符相加,并使用yield return语句将结果返回。这样就可以生成一个类似于Excel中列排序方式的从A到ZZ的数组。

如果不介意以空字符串开始序列,可以稍作修改:在generate函数的开始使用yield return语句返回一个空字符串。然后在内部的for循环中继续遍历从'A'到'Z'的字符,并使用yield return语句将结果返回。这样也可以生成一个类似于Excel中列排序方式的从A到ZZ的数组。

这种方法的巧妙之处在于使用了yield关键字和递归函数来生成无限序列。通过不断调用generate函数并在内部的for循环中生成新的字符串,可以无限地扩展数组的长度,直到达到目标长度为止。这种方法简洁而又高效,可以方便地生成类似于Excel中列排序方式的从A到ZZ的数组。

0
0 Comments

从以上内容中我们可以得出以下问题的出现原因和解决方法:

问题:在C#中如何按照Excel列的顺序生成从A到ZZ的数组?

原因:Excel中的列按照字母的顺序进行排序,而C#中的数组并不直接支持这种排序方式。因此,需要找到一种方法来生成类似Excel列排序的数组。

解决方法:

1. 使用yield关键字生成器函数来生成从A到Z的数组。这个函数使用两个for循环嵌套,第一个循环生成A到Z的单个字母,第二个循环生成AA到ZZ的双字母。具体代码如下:

IEnumerable 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 });
}

2. 可以使用稍微复杂一点的代码来生成“无限”序列(以最大的long值为界限)。这个函数使用递归的方法将数字转换为基于26进制的字母形式。具体代码如下:

string toBase26(long i)
{
    if (i == 0) return ""; i--;
    return toBase26(i / 26) + (char)('A' + i % 26);
}
IEnumerable generate()
{
    long n = 0;
    while (true) yield return toBase26(++n);
}

3. 使用foreach循环和Take方法来输出生成的数组。这个方法会输出前200个元素。具体代码如下:

foreach (var s in generate().Take(200)) Console.WriteLine(s);

以上方法中的第二种方法更加简洁和优雅,可以生成无限序列。

注意:以上方法生成的数组并不完全是基于26进制的,因为Excel中的AA与A表示的含义不同。但是这种方法与基于26进制的方法非常接近,可以满足大部分需求。

0