簡體   English   中英

C#將字符串轉換為多維int數組

[英]C# Convert a string to multidimensional int array

我制作了一個使用多維數字陣列的磁貼級系統,例如:

new int[,]{
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,},
            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},

每個特定的數字代表一個塊(tile)。 這只是代碼。 我想編寫一個可以加載一個級別的系統(一個多維的int數組)該數組需要從一個字符串轉換。 我怎么做?

    public static int[,] getLvl(string lvlName = "")
    {
        string readed = "";
        using (StreamReader read = new StreamReader(path))
        {
            readed = read.ReadToEnd();
        }
        return null; //What to put here?!?!?!
    }

編輯:我還沒有要讀取的文件格式。 所以你可以靈活。

我不認為您真的需要或者應該嘗試將其序列化為XML或其他格式,因為您的數據存儲非常簡單。

一種簡單的方法是將數組作為逗號分隔值存儲在文本文件中。 所以一個級別可能有:

0,0,0,1
0,1,1,0
0,1,1,3
3,3,4,1

String.Split()方法對於解析像這樣簡單的東西非常有用。 它允許您根據特定的分隔字符將字符串拆分為子字符串數組。

一步步:

首先,您可以使用var RowArray = MyString.Split('\\n') (換行符)將字符串拆分為行數組。 這將為您留下陣列:

[0]: "0,0,0,1"
[1]: "0,1,1,0"
[2]: "0,1,1,3"
[3]: "3,3,4,1"

你可以看看Split()在這里做了什么以及為什么這對你的情況很有用。 您可以依次在','上運行拆分每行','留下一個數組數組,您可以很容易地將其轉換為您正在尋找的2D數組。

這里的一個陷阱是某處,根據您的設計需要,一個不變量可能必須是在文件中所有行將具有相同的長度。 或者,如果你不能保證這一點,你將不得不編寫一些代碼,以便在將下面的文本從行數組轉換為數組時,使寬度等於最長的行,並用0或一些填充空白其他方法。

0,0,0,1,6,4
0,1,1,0
0,1,1,3,2,6,3,7,1
3,3,4,1,2,4

最短的方法是使用linq,格式如下:

 0,0,0,0,0
 1,0,1,0,1
 ....

你可以用這句話:

 int[][] Data =   File.ReadAllLines( path )
                      .Select( s => s.Trim())
                      .Where( s => !string.IsNullOrempty(s))
                      .Select( s => s.Split( ',' )
                                     .Select( token => int.Parse( token ) )
                                     .ToArray( ) )
                      .ToArray( );

 var DataToOneDim = Data.SelectMany( a => a).ToArray();
 var Result = new int[Data[0].Length, Data.Length];
 Buffer.BlockCopy( DataToOneDim, 0, Result, 0, DataToOneDim.Length );

我相信還有一些關於此的帖子,但您可以使用XML並解析每個可能的維度,或使用SoapFormatter類一次序列化所有內容。 以下是一個類似問題的鏈接,其中包含一些示例:

將多維數組轉換為字符串和返回

我為你做得快,你可以做得更好不要忘記投票:_)

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{

    var array =
        "{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,} , {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}";

    string input = array;
    string pattern = @"{|}";
    var index = 0;
    var results = new int[100,100];
    foreach (var result in Regex.Split(input, pattern))
    {
        var sp = result.Split(',');
        if (sp.Length <4)
        continue;

        for (int i = 0; i < sp.Count(); i++)
        {
            if (!string.IsNullOrEmpty(sp[i]))
             results[index,i] = Convert.ToInt32(sp[i]);
        }

        index++;
    }
   }
  }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM