【问题标题】:String array declaration using for loop使用 for 循环声明字符串数组
【发布时间】:2013-08-14 20:36:12
【问题描述】:

我需要在 C# 中声明包含数组的 32 个字符串数组。 把它全部写出来就可以了,类似于这样:

string[] row1 = new string[] { "NO.", "DATA BIN", "BIT2", "BIT1", };
string[] row2 = new string[] { "1", DataBin[1], BitLabels[1, 1], BitLabels[0, 1], };
string[] row3 = new string[] { "2", DataBin[2], BitLabels[1, 2], BitLabels[0, 2], };
string[] row4 = new string[] { "3", DataBin[3], BitLabels[1, 3], BitLabels[0, 3], }; 

但如果我能像这样创建它们会更干净/更容易:

string[] row1 = new string[] { "NO.", "DATA BIN", "BIT2", "BIT1", };
for (int i = 2; i < 33; i++)
{
string[] row(i) = new string[] { Convert.ToString(i), DataBin[i], BitLabels[1, i], BitLabels[0, i], };
}

问题是我无法索引实例名称(例如 row1)

这是针对 DataGridView 的,所以我还需要处理以下内容:

object[] rows = new object[] { row1 , row2 , row3 , row4 , row5 , row6 , row7 , row8 , row9 ,
                               row10 , row11 , row12 , row13 , row14 , row15 , row16 , row17 ,
                               row18 , row19 , row20 , row21 , row22 , row23 , row24 , row25 ,
                               row26 , row27 , row28 , row29 , row30 , row31 , row32 , row33 };            
foreach (string[] rowArray in rows)
        {
            myDataGridView.Rows.Add(rowArray);
        }

有什么建议吗? (为清楚起见,抱歉进行了多次编辑)

【问题讨论】:

  • 您对 DGV 列和标题的工作方式有错误的概念。

标签: c# arrays for-loop declaration


【解决方案1】:

您可以使用多维 ([,]) 或锯齿 ([][]) 数组。

根据您的示例,我会选择锯齿状(数组数组):

string[][] rows = new string[32][];

for (int i = 0; i < rows.Length; i++)
{
    int n = i+1;  // you seem to use 1 as origin
    rows [i] = new string[] { n.ToString(), DataBin[n], ... };
}

编辑:这是用于 DataGridView,所以...

所以你实际上不能使用数组(对于列),你需要一个合适的类。使用要绑定的属性名称。您也不需要行数组(限制)。

从你所在的地方到达你需要去的地方的一种简单方法是使用匿名类:

(向蒂姆借一段)

var rows = Enumerable.Range(1, 32)
     .Select(i => new {   // this is the anon class
         Index = i.ToString(),   // on-the-fly property 'Index'
         Text1 = DataBin[i], 
         Text2 = BitLabels[2, i], 
         Text3 = BitLabels[1, i],  /* etc */ }
       );

然后您可以将列绑定到 Index、Text1、Text2 等

【讨论】:

  • 为什么?这就是你在这里似乎需要的。不过只有 2 个级别。
  • 它们是属性,你需要类似column1.DataField="Index";
【解决方案2】:

也许你想使用 Linq:

string[][] rows = Enumerable.Range(1, 32)
    .Select(i => new [] { i.ToString(), DataBin[i], BitLabels[2, i], BitLabels[1, i], BitLabels[0, i], })
    .ToArray();

【讨论】:

    【解决方案3】:

    您可以使用List&lt;string[]&gt; 作为示例:

    var rows = new List<string[]>();
    
    for (int i = 0; i < 32; i++)
    {
       rows.Add(new string[] { Convert.ToString(i), DataBin[i], BitLabels[2, i], BitLabels[1, i], BitLabels[0, i] });
    }
    

    之后,可以使用rows对象和访问方式

    rows[0][3]

    第一个索引是列表的一个项目,第二个索引是数组的索引。

    您也可以调用ToArray() 并获取string[] 的数组。

    【讨论】:

      【解决方案4】:

      看起来你几乎得到了它。数组答案是一个很好的答案。另一种可能的方法是使用列表。如果需要,您可以稍后将列表转换为数组。如您所见,代码干净且易于理解。

      var rows = new List<string[]>();
      for (int i = 0; i < 32; i++)
      {
          var row = new string[] { Convert.ToString(i), DataBin[i], BitLabels[2, i], BitLabels[1, i], BitLabels[0, i], };
          rows.Add(row);
      }
      
      // use rows.ToArray() if you need it to be an array or arrays later.
      

      【讨论】:

      • 这个解决方案只需稍加调整就可以很好地工作(我决定不使用 var)。 myDataGridView.Rows.Add(new string[] { "NO.", "DATA BIN", "BIT1", "BIT0", }); for (int i = 1; i &lt; 33; i++) { myDataGridView.Rows.Add(new string[] { Convert.ToString(i), DataBin[i], BitLabels[1, i], BitLabels[0, i], }); }
      猜你喜欢
      • 2016-07-13
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2012-10-22
      相关资源
      最近更新 更多