2017-01-09 14 views
2

私は、レジスタ値とその内容を引き出すために読んでいるテキストファイルを持っています。アレイから配列を2Dまたは2つの配列に分割する

2線が引き出されている:

0x0003 = 0x0069

0x0007 = 0x0078

Iは、2つの配列または1つの2次元配列にこれらを分割したい(完全なリストは約700です)、どのようなベスト(私は配列を使用して新しいです)

私の目標は、レジスタ3のような配列を検索し、インデックスを見つけ、次に2番目の配列対応するインデックスから情報を抽出することです。

はここ

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; 

このすべては何の問題も働かないと私はテキストボックス内のレジスタの内容を表示しています、これまでの私のコードです。しかし、私は2つの配列がより適切であるようにしたいと思います.1つはレジスタ番号で、もう1つは内容です。私はそれを把握できない、どんな助けも高く評価されるだろう。答えを読んだ後

UPDATE

最終的なコード、

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 

おかげでみんな

+1

「辞書」を使用してください。 –

答えて

5

私は、LINQのを使用することをお勧め:あなたは配列を主張する場合は

を:

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

最初のインデックスはあなたが辞書としてデータをマテリアライズすることができます(キーとしての役割を果たすことができますので)ユニークである場合:

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

最初の配列はユニークなので、今すぐ辞書を調べてコードを試してみましょう – JohnChris

0

辞書を使用してみてください:

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

string content = registersKeyValue 
    .Where(keyValuePair => keyValuePair.Key == "0x0003") 
    .FirstOrDefault() 
    .Value; 
関連する問題