将文本文件中的值添加到二维int数组

时间:2018-12-03 15:05:48

标签: c# arrays multidimensional-array int

我正在尝试将值添加到int[,]的二维数组中

文本文件ConnectedCaves包含以下数据

  

0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0 ,0,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0

我需要采用以下格式;

int[,] graph = new int[,] 
{
    { 0,0,0,1,0,0,0 },
    { 0,0,0,1,1,0,0 },
    { 0,0,0,0,1,1,1 },
    { 1,0,0,0,1,1,0 },
    { 0,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,0 },
    { 0,0,1,0,0,0,0 }
};

关于如何完成这项工作,我还找不到很多。而且根本没有任何可用于共享的代码。

是否可以将其在文本文件中出现时添加到二维数组中?如果不是直接使用文本文件中显示的格式将这些数据放入数组的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

几乎是Json

Array definition

由此我们知道,字符串的最终结构必须类似于:

[
  [ 0,0,0,1,0,0,0 ],
  [ 0,0,0,1,1,0,0 ]
]

因此,使用简单的replace,并使用Json.net反序列化json:

var inputs =
@"{ 0,0,0,1,0,0,0 },
{ 0,0,0,1,1,0,0 }";

var jsoned = String.Format("[{0}]", inputs.Replace('{', '[').Replace('}', ']'));
var result = JsonConvert.DeserializeObject<int[,]>(jsoned);

答案 1 :(得分:0)

您需要以下代码:

  1. 将输入拆分为行。
  2. 将每一行拆分为单元格,字段或单独的值
  3. 将这些值放入数组

我认为,可以使用REGEX完成步骤1 + 2。那些花括号不存在,任何CSV解析代码也都可以处理。

第3步可能需要解析。通常,您不想在代码中使用字符串或char。这看起来像整数,所以将它们解析为整数并使用它们。

关于后端数组:如果您不知道会有多少行-甚至每行多少字段-您必须使用List或其他高级集合。对于那些人,您只能使用锯齿状的afaik。

答案 2 :(得分:0)

使用SplitTrimSelect,您可以轻松拥有List<int[]>

var inputs =
@"{ 0,0,0,1,0,0,0 },
{ 0,0,0,1,1,0,0 },";

var lines = inputs.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

var dim =
    lines.Select(
        line =>
        line.Trim(new[] {'{', '}', ','})
            .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(element => int.Parse(element))
            .ToArray()
    ).ToList();

然后您可以使用Jon's answerHow to convert list of arrays into a multidimensional array

static T[,] CreateRectangularArray<T>(IList<T[]> arrays)
{
    // TODO: Validation and special-casing for arrays.Count == 0
    int minorLength = arrays[0].Length;
    T[,] ret = new T[arrays.Count, minorLength];
    for (int i = 0; i < arrays.Count; i++)
    {
        var array = arrays[i];
        if (array.Length != minorLength)
        {
            throw new ArgumentException
                ("All arrays must be the same length");
        }
        for (int j = 0; j < minorLength; j++)
        {
            ret[i, j] = array[j];
        }
    }
    return ret;
}