2014-10-08 143 views
0

我正在閱讀包含字母數字值網格的文本文件(請參見下文)。將字符串分成由兩個字符組成的字符串

IQQQQQ 
WG2223 
S22228 
D22223 

當前這些值被循環並且每個字符被髮送到交換機箱。然後該開關讀取該字符並輸出給定​​的結果。這個過程的代碼如下。

private void LoadLevel(Stream stream) 
{ 
    List<string> lines = new List<string>(); 
    uint width; 

    using (StreamReader reader = new StreamReader(stream)) 
    { 
      string line = reader.ReadLine(); 
      width = (uint)line.Length; 

      while (line != null) 
      { 
       lines.Add(line);  
       line = reader.ReadLine(); 
      } 
    } 

    tiles = new Tile[width, lines.Count]; 

    for (int y = 0; y < Height; ++y) 
    { 
     for (int x = 0; x < Width; ++x) 
     { 
      char type = lines[y][x]; 
      tiles[x, y] = LoadTile(type, x, y); 
     } 
    } 
} 

在這段代碼中檢索到文本文件,並在列表中的每一行,然後循環每個字符存儲通過每一行,並提取在網格中的特定點。我不想提取單個字符,而是想同時提取兩個字符,並將其傳遞給LoadTile函數。

以網格的第一行爲例。

IQQQQQ 

我想每個長兩個字符這條線拆分爲三個字符串,然後傳遞到LoadTile,然後繼續通過電網的剩餘部分循環。但是我不知道從哪裏開始嘗試完成這項任務。任何幫助,將不勝感激。

回答

2

好第一關,你會propably想要的LoadTile簽名從LoadTile(char, int, int)更改爲LoadTile(string, int, int)。然後改變寬度的計算爲

width = line.Length/2; 

當然,如果任何行有奇數個字符,你將失去最後一個字符。此外,如果第一行之後的任何一行較短,則會有例外,如果長一些,則會丟失其他數據。

然後你可以像這樣循環,並採取子字符串。

for (int y = 0; y < Height; ++y) 
{ 
    for (int x = 0; x < Width; ++x) 
    { 
     string type = lines[y].Substring(x*2,2); 
     tiles[x, y] = LoadTile(type, x, y); 
    } 
} 
+0

我已經接受你的評論作爲答案,因爲你的解決方案是圍繞現有方法實現最快。 – Nexuz 2014-10-08 14:15:56

2

你可以這樣做:

var str = "IQQQQQ"; 
var arr = Regex.Matches(str, "..").Cast<Match>().ToArray().Select(u => u.Value); 
// arr[0] = "IQ" 
// arr[1] = "QQ" 
// arr[2] = "QQ" 
+1

正則表達式似乎矯枉過正這個 – DavidG 2014-10-08 11:56:37

+0

@DavidG我知道,但是,儘管如此,我的代碼C#很好,當我有IDE,我不記得了瑣碎的方法爲特徵的我在C#中編寫的代碼並不像我在JS中那樣多,但是我知道'Regex'類,所以結果:) – 2014-10-08 11:57:59

+0

嘗試使用LinqPad,可以快速打開C#(和VB.Net)代碼。 – DavidG 2014-10-08 11:59:33

2

這是你如何得到一個字符串:

var item = source.Substring(i * 2, 2); 

您可以分割到陣列中的一行:

var split = Enumerable.Range(0,3).Select(i=>source.Substring(i * 2, 2)).ToArray(); 

for (var i = 0; i < 3; i++) 
{ 
    var item = split[i]; 
    // ... 
} 
1

使用LINQ。嘗試做這行的每一行:

//Converts the string to a List of strings 
List<string> stringArray = line.ToCharArray().Select(c=>c.ToString()).ToList(); 
//Iterates over the list and concats every pair of elements 
List<string> result = stringArray.Select((value, index) => new { value, index }) 
    .GroupBy(x => x.index/2, x => x.value).Select(pair => pair.Aggregate((s1,s2) => s1 + s2)).ToList();