【问题标题】:For loop when the values of the loop variable is a string of the pattern LetterNumberNumber?当循环变量的值是模式 LetterNumberNumber 的字符串时,for 循环?
【发布时间】:2015-10-02 21:26:45
【问题描述】:

当循环变量为整数时,我知道使用 for 循环。我强烈需要创建一个 for 循环,其中循环变量将取值 A00、A01、...、A99、B00、B01、B99、...、Z99。我们是否允许在 C# 中使用混合模式作为循环变量的值?

在这种情况下,我们如何增加循环变量?我想做的草稿:
for (string i = A00, A01, ...,Z99; ???; ???)
{...}

如果不允许我们使用循环变量这样的值,有什么办法来处理这种情况?

有什么想法吗?

【问题讨论】:

    标签: c# loops


    【解决方案1】:

    你可以有两个重叠的循环来返回你的字符串。

    例如:

    public IEnumerable<string> GetLabels()
    {
        for (char l = 'a'; l < 'z'; l++)
        {
            for (int d = 0; d < 99; d++)
            {
                yield return string.Format("{0}{1:D2}", l, d);
            }
        }    
    }
    

    注意:收益返回允许您拥有一个可枚举的对象,而不必一次构建整个组合。如果在 Linq 查询或 foreach 循环中使用,则将在需要它们之前构建这些值。

    【讨论】:

    • 我正在尝试了解/确认您的解决方案。 “产量”对我来说是新的。我想做(当用户单击按钮时)A00,....,Z99 成为 Windows 窗体中 TextBox 中的一个值,在我检查值时会自动更改(无需手动输入)布尔变量:情况 == 函数(参数 1,...,参数 5,...)。 parameter5 将取值 A00,...,Z99,我将根据变量情况的值做一些工作。当然,可能不需要 TextBox。 TextBox只是为了后期限制扫描范围。
    • @ErdoganCEVHER 你所描述的根本不是一个循环。
    • 更多关于收益回报/收益中断的信息:msdn.microsoft.com/en-us/library/9k7k7cf0.aspx
    • @PanagiotisKanavos,我猜到了。但是,我想这样做,因为这个问题的答案可能会揭示我对这个问题的一般处理方式。
    【解决方案2】:

    还有不可避免的 LINQ 变体 - 您可以使用 LINQ 和 Enumerable.Range 生成一系列字母和数字,例如:

    var maxLetters=3;
    var maxNumbers=3;
    
    var values=from char c in Enumerable.Range('A',maxLetters).Select(c=>(char)c)
               from int i in Enumerable.Range(1,maxNumbers)
               select String.Format("{0}{1:d2}",(char)c,i);
    
    foreach(var value in values)
    {
        Console.WriteLine(value);
    }
    
    --------
    A01
    A02
    A03
    B01
    B02
    B03
    C01
    C02
    C03
    D01
    D02
    D03
    

    字符等价于 C# 中的整数,这意味着您可以使用 Enumerable.Range 生成递增整数的序列。但 Enumerable.Range 将返回整数,这就是为什么需要强制转换回 char

    您也可以通过从结束字母减去起始字母来指定要使用的数字或字母,如this SO question所示:

    var maxLetters = 'D' - 'A' +1;
    

    获得索引序列后,您可以使用 foreach 对其进行迭代。

    【讨论】:

    • 非常感谢。我成功地将您的解决方案嵌入到我的工作中。它工作得很好。我把 maxLetters=26; maxNumbers=99 在我的项目中。我注意到您提供的代码缺少 00s(A00、B00、...、Z00),但这并没有影响我的工作,因为后来我注意到我想要解密的东西也排除了它们。再次感谢您。
    【解决方案3】:

    您可以使用双循环构造列表:

    for (char c = 'A'; c <= 'Z'; c++)
    {
        for (int i = 0; i < 100; i++)
        {
            string s = $"{c}{i:d2}";
        }
    }
    

    既然A00 不可能是int,为什么不把它变成一个字符串并使用foreach 对其进行迭代呢?您可以使用yield 来简化迭代并防止创建无限列表

    foreach (string s in listOfPossibilities)
    { }
    

    根据您构造A00...Z99 的逻辑,如果可能的话,您还可以用整数构造字符串。您需要自己进行一些转换。

    for (int i = 0;;)
    {
        string s = ConvertIntergerToSpecial(i);
    }
    

    【讨论】:

    • 这会很有趣,有 2600 个条目。
    【解决方案4】:

    循环变量只能是一种类型,你可以使用Int.Parse()结合子字符串或RegEx:

    using System.Text.RegularExpressions;
    

    代码:

    Regex regex = new Regex(@"[A-Z]");
    Match match = regex.Match("A00");
    // match is now A
    Regex regex = new Regex(@"\d+");
    Match match = regex.Match("A00");
    // match is now 00
    

    【讨论】:

      【解决方案5】:

      我喜欢这里针对该问题发布的其他答案,尤其是 LINQ 方法。这是一个单循环的方式,只是外行的编程东西,

                  String result = "";
                  char c =  'A';
                  String v = "";
                  for (int i = 0; v != "Z99"; i++)    // Loop until you reach Z99
                  {
                      v = String.Format("{0}{1:D2}", c, i); // A00,A001.... Z99
                      if (i == 99) { i = 0; c++; }  // Reset counter and increment character
                      result += v +" "; // Just to display the result
                  }
                  MessageBox.Show(result);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多