C# 从txt文件创建二维数组

C# 从txt文件创建二维数组,c#,string,multidimensional-array,xna,xna-4.0,C#,String,Multidimensional Array,Xna,Xna 4.0,好的,我已经设法读入了一个.txt文件。。。现在我正试图找出将这些信息转换为二维数组的最佳方法 我的文本文件(前两个数字提供高度和宽度): 我的C#/XNA: 现在我接下来需要做的是定义二维贴图数组的大小,然后填充输入值。。。这就是我被卡住的地方,我已经找到了各种方法来循环浏览数据,但我不认为它们中有任何一个是非常整洁的 我试着做的是让一个循环通过换行符分开。。。然后是另一个以逗号分隔符分隔的循环 这是最好的方法吗。。。或者有更好的替代方案吗?下面的代码不需要示例.CSV文件中的第一行: 5 5

好的,我已经设法读入了一个.txt文件。。。现在我正试图找出将这些信息转换为二维数组的最佳方法

我的文本文件(前两个数字提供高度和宽度):

我的C#/XNA:

现在我接下来需要做的是定义二维贴图数组的大小,然后填充输入值。。。这就是我被卡住的地方,我已经找到了各种方法来循环浏览数据,但我不认为它们中有任何一个是非常整洁的

我试着做的是让一个循环通过换行符分开。。。然后是另一个以逗号分隔符分隔的循环


这是最好的方法吗。。。或者有更好的替代方案吗?

下面的代码不需要示例.CSV文件中的第一行:

5
5
我更喜欢这种方式,但结果是,下面的代码会读取文件两次。使用示例中的前两行进行小修改

private int[,] LoadData(string inputFilePath)
{
  int[,] data = null;

  if (File.Exists(inputFilePath))
  {
    Dictionary<string, int> counts = GetRowAndColumnCounts(inputFilePath);

    int rowCount = counts["row_count"];
    int columnCount = counts["column_count"];

    data = new int[rowCount, columnCount];

    using (StreamReader sr = File.OpenText(inputFilePath))
    {
      string s = "";
      string[] split = null;

      for (int i = 0; (s = sr.ReadLine()) != null; i++)
      {
        split = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        for (int j = 0; j < columnCount; j++)
        {
          data[i, j] = int.Parse(split[j]);
        }
      }
    }
  }
  else
  {
    throw new FileDoesNotExistException("Input file does not exist");
  }

  return data;
}

private Dictionary<string, int> GetRowAndColumnCounts(string inputFilePath)
{
  int rowCount = 0;
  int columnCount = 0;

  if (File.Exists(inputFilePath))
  {
    using (StreamReader sr = File.OpenText(inputFilePath))
    {
      string[] split = null;
      int lineCount = 0;

      for (string s = sr.ReadLine(); s != null; s = sr.ReadLine())
      {
        split = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        if (columnCount == 0)
        {
          columnCount = split.Length;
        }

        lineCount++;
      }

      rowCount = lineCount;
    }

    if (rowCount == 0 || columnCount == 0)
    {
      throw new FileEmptyException("No input data");
    }
  }
  else
  {
    throw new FileDoesNotExistException("Input file does not exist");
  }

  Dictionary<string, int> counts = new Dictionary<string, int>();

  counts.Add("row_count", rowCount);
  counts.Add("column_count", columnCount);

  return counts;
}
private int[,]LoadData(字符串输入文件路径)
{
int[,]数据=null;
if(File.Exists(inputFilePath))
{
字典计数=GetRowAndColumnCounts(inputFilePath);
int rowCount=计数[“行计数”];
int columnCount=计数[“column_count”];
data=newint[rowCount,columnCount];
使用(StreamReader sr=File.OpenText(inputFilePath))
{
字符串s=“”;
string[]split=null;
for(int i=0;(s=sr.ReadLine())!=null;i++)
{
split=s.split(新字符[]{',},StringSplitOptions.RemoveEmptyEntries);
对于(int j=0;j
以下是我提出的解决方案,它似乎有效

int[,] txtmap;
int height = 0;
int width = 0;
string fileContents = string.Empty;

try
{
    using (StreamReader reader = new StreamReader("Content/map.txt"))
    {
        fileContents = reader.ReadToEnd().ToString();
    }
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

string[] parts = fileContents.Split(new string[] { "\r\n" }, StringSplitOptions.None);
for (int i = 0; i < parts.Length; i++)
{
    if (i == 0)
    {
        // set width
        width = Int16.Parse(parts[i]);
    }
    else if (i == 1)
    {
        // set height
        height = Int16.Parse(parts[i]);

        txtmap = new int[width, height];
    }

    if (i > 1)
    {
        // loop through tiles and assign them as needed
        string[] tiles = parts[i].Split(new string[] { "," }, StringSplitOptions.None);
        for (int j = 0; j < tiles.Length; j++)
        {
            txtmap[i - 2, j] = Int16.Parse(tiles[j]);
        }
    }
}
int[,]txtmap;
整数高度=0;
整数宽度=0;
string fileContents=string.Empty;
尝试
{
使用(StreamReader=newstreamreader(“Content/map.txt”))
{
fileContents=reader.ReadToEnd().ToString();
}
}
捕获(例外e)
{
控制台写入线(e.Message);
}
string[]parts=fileContents.Split(新字符串[]{“\r\n”},StringSplitOptions.None);
对于(int i=0;i1)
{
//循环浏览分幅并根据需要分配它们
字符串[]tiles=parts[i].Split(新字符串[]{“,”},StringSplitOptions.None);
对于(int j=0;j
这可以用LINQ完成,但只有当您想要(接受)数组的数组,
int[][]
而不是直接的二维
int[,]
时,才实用

int[][] data = 
    File.ReadLines(fileName)
    .Skip(2)
    .Select(l => l.Split(',').Select(n => int.Parse(n)).ToArray())
    .ToArray();

听起来你走对了方向。可能尝试使用扩展方法,例如ToArray()@JohnSaunders对不起,我的错误。这看起来有点长。。。看看我的解决方案。是的,你做了我提到的修改。将高度和宽度放在前两行可以消除第二个功能的需要。但是,我不喜欢您的输入文件格式。这是一种偏好。嗯。。。我能理解。。。一旦它变大,就很难计算列的数量等。。。所以自动化会有所帮助。这就是所谓的“锯齿”阵列吗?是的,但我更喜欢ArraySP阵列:我不确定所有这些(读线)在XNA中是否都可用。错过了那个标签。我想有一个
Readline()
可以一个接一个地显示它们。我还没有遇到复数版本。和
System.IO.File.ReadAllLines()
int[,] txtmap;
int height = 0;
int width = 0;
string fileContents = string.Empty;

try
{
    using (StreamReader reader = new StreamReader("Content/map.txt"))
    {
        fileContents = reader.ReadToEnd().ToString();
    }
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

string[] parts = fileContents.Split(new string[] { "\r\n" }, StringSplitOptions.None);
for (int i = 0; i < parts.Length; i++)
{
    if (i == 0)
    {
        // set width
        width = Int16.Parse(parts[i]);
    }
    else if (i == 1)
    {
        // set height
        height = Int16.Parse(parts[i]);

        txtmap = new int[width, height];
    }

    if (i > 1)
    {
        // loop through tiles and assign them as needed
        string[] tiles = parts[i].Split(new string[] { "," }, StringSplitOptions.None);
        for (int j = 0; j < tiles.Length; j++)
        {
            txtmap[i - 2, j] = Int16.Parse(tiles[j]);
        }
    }
}
int[][] data = 
    File.ReadLines(fileName)
    .Skip(2)
    .Select(l => l.Split(',').Select(n => int.Parse(n)).ToArray())
    .ToArray();