将数组拆分为2D或两个数组

时间:2017-01-09 07:29:15

标签: c#

我正在阅读一个文本文件来提取寄存器值及其包含的内容。

拉出阵列的2行是:(完整列表大约是700)

0x0003 = 0x0069

0x0007 = 0x0078

我想把它们分成两个数组或一个二维数组,无论什么是最好的(我是新手使用数组)

我的目标是搜索数组例如寄存器3,找到索引然后从第二个数组中提取相应索引的信息。

到目前为止,这是我的代码,

  List<string> registerFullList1 = new List<string>();

     for (int i = 0; i < 2000; i++) 
       {
          string[] importStringArray1 = new string[2000];
          importStringArray1[i] = importStringArray1[i] + objReader.ReadLine() + "\r\n";
          //code to extract register info from string array
          string listsplit1 = Regex.Match(importStringArray1[i], @"(?<= 0x)[0-9A-Fa-z\s\=]{13}").Value; 


          if (listsplit1.Contains("0x")) //code to add to list only registers and ignore empty lines
            {
              registerFullList1.Add(Convert.ToString(listsplit1));
            }

                }

  int[] index = new int[2000]; // is there a way here that I don't have to assign  0,1,2,3 to each assignment?

  index[0] = registerFullList1.FindIndex(x => x.StartsWith("0003 ="));
  Register3.Text = Regex.Match(registerFullList1[index[0]], @"(?<= 0x)[0-9A-F]{4}").Value; 

  index[1] = registerFullList1.FindIndex(x => x.StartsWith("0007 ="));
  Register7.Text = Regex.Match(registerFullList1[index[1]], @"(?<= 0x)[0-9A-F]{4}").Value;

这一切都没有问题,我在文本框中显示寄存器内容。但我想要两个数组,所以它更合适,一个有寄存器号,另一个有内容。我无法弄清楚,任何帮助都会受到赞赏。

更新

阅读答案后的最终代码,

    List<string> registerNumberList = new List<string>();
    List<string> registerContentList = new List<string>();                 
    List<string> registerFullList = new List<string>();

     for (int i = 0; i < 2000; i++)
       {
         string[] importStringArray1 = new string[2000];
         importStringArray1[i] = importStringArray1[i] + objReader.ReadLine() + "\r\n";

         string listsplit1 = Regex.Match(importStringArray1[i], @"(?<= 0x)[0-9A-Fa-z\s\=]{13}").Value; // @"(?<== 0x)[0-9A-F]{4}"  
         string listsplit2 = Regex.Match(importStringArray1[i], @"(?<= 0x)[0-9A-Fa-z\s\=]{4}").Value;// pulls out the register number from original array
           string listsplit3= Regex.Match(importStringArray1[i], @"(?<== 0x)[0-9A-Fa-z\s\=]{4}").Value;//pulls out register content from original array

         if (listsplit1.Contains("0x"))
           {
              registerNumberList.Add(Convert.ToString(listsplit3));//makes a list with register numbers
              registerContentList.Add(Convert.ToString(listsplit2) );//makes a list with register content
              registerFullList.Add(Convert.ToString(listsplit2) + "=" + Convert.ToString(listsplit3));//the full list

                    }

                }

                Dictionary <string, string> registers = registerFullList.Select(line => line.Split('=')
                         .ToArray())
                         .ToDictionary(items => items[0], items => items[1]);   //joins the register numbers and content into a dictionary with just 4 decimal values for each

                 list1.Text = String.Join("\r\n", registerFullList);



                list2.Text =  registers["0010"]; // pulls out register info

谢谢你们

2 个答案:

答案 0 :(得分:5)

我建议使用 Linq

如果你坚持阵列:

  int[][] result = File
    .ReadLines(@"C:\myFile.txt")
    .Select(line => line
       .Split('=')
       .Select(item => Convert.ToInt32(item, 16))
       .ToArray())
    .ToArray();

如果第一个索引唯一一个(因此可以作为),您可以将数据实现为词典:< / p>

  Dictionary<int, int> result = File
    .ReadLines(@"C:\myFile.txt")
    .Select(line => line
       .Split('=')
       .Select(item => Convert.ToInt32(item, 16))
       .ToArray())
    .ToDictionary(items => items[0], items => items[1]);

  ...

  // value == 0x0078 (120)
  int value = result[0x0007];

答案 1 :(得分:0)

尝试使用字典:

Dictionary<string, string> registersKeyValue = new Dictionary<string, string>();

string content = registersKeyValue
  .Where(keyValuePair => keyValuePair.Key == "0x0003")
  .FirstOrDefault()
  .Value;