C#将字符串转换为多维int数组
本文关键字:int 数组 字符串 转换 | 更新日期: 2023-09-27 18:29:36
我制作了一个使用多维数组的瓦片级系统,例如:
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,},
每个特定的数字表示一个块(瓦片)。这只是代码。我想编码一个可以加载级别的系统(一个多进制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++;
}
}
}
}