Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态多维数组c#_C#_Arrays_Dynamic - Fatal编程技术网

动态多维数组c#

动态多维数组c#,c#,arrays,dynamic,C#,Arrays,Dynamic,我不知道以前是否回答过这个问题,但这个问题确实很具体。我正在尝试用c#编写一个地下城生成器,我希望数组的大小是动态的,并根据输入的大小在控制台中显示为网格。我让数组是动态的,它可以以网格形式显示每个索引,但我不知道如何使一行中的索引数量是动态的。以下是我目前掌握的情况: Random rand = new Random(); int num; num = Convert.ToInt32(Console.ReadLine()); in

我不知道以前是否回答过这个问题,但这个问题确实很具体。我正在尝试用c#编写一个地下城生成器,我希望数组的大小是动态的,并根据输入的大小在控制台中显示为网格。我让数组是动态的,它可以以网格形式显示每个索引,但我不知道如何使一行中的索引数量是动态的。以下是我目前掌握的情况:

        Random rand = new Random();
        int num;
        num = Convert.ToInt32(Console.ReadLine());
        int x = num;
        int y = num;
        int i = x - 1;
        int j = y - 1;
        int[,] dungeon = new int[x,y];

        for(int z = 0; z <= i; z++)
        {
            int a = 0;
            for( a = 0; a <= j; a++)
              {
                  dungeon[a,z] = rand.Next(0,2);
              }

            }
            for (int h = 0; h <= i; h++) 
            {
                if (h == 0)
                {
                    Console.WriteLine("#-#-#-#-#");
                }
            Console.WriteLine("|" + dungeon[h,0] + "|" + dungeon[h,1] + "|" + dungeon[h,2] + "|" + dungeon[h,3] + "|");
            Console.WriteLine("#-#-#-#-#");
Random rand=new Random();
int-num;
num=Convert.ToInt32(Console.ReadLine());
int x=num;
int y=num;
int i=x-1;
int j=y-1;
int[,]地下城=新int[x,y];

对于(int z=0;z嗯,当前网格始终是一个精确的正方形。因为两个维度使用相同的值。是否只想为每个维度使用一个单独的值?如果是,则需要从输入中获取另一个值。可以使用与现有方法相同的方法进行此操作。例如:

int x = Convert.ToInt32(Console.ReadLine());
int y = Convert.ToInt32(Console.ReadLine());
有几件事需要注意:

  • 您不需要
    num
    变量,只需立即将其分配给另一个变量,然后再也不要使用
    num
    。只需首先使用您想要的变量即可
  • 作为一项学术练习,请查看
    int.TryParse()
    以及如何使用它的示例。当前,如果输入的不是整数,则应用程序将崩溃。使用
    int.TryParse()
    可以处理该错误情况
  • 另外,作为一个学术练习,请看一下使用嵌套列表而不是二维数组。类似于
    list
    。在某些方面,它看起来更详细(re:messy),在其他方面,它会更有用。从这里继续,尝试将整个数据结构封装到自定义对象中(
    Grid
    Board
    似乎是合理的名称)。这将允许您将任何混乱的内容放入类中,然后游戏逻辑可以与该类进行干净的交互
  • 我希望数组的大小是动态的

    因此,如果您对泛型集合没有限制,我强烈建议您使用列表。忽略更好的清除用户输入的方法,使用列表的代码可能如下所示。因为我们使用的是面向对象的语言,所以最好创建表示我们需要的对象(单元格、网格等)。然后创建表示这些对象(行、列、值)所需内容的属性或方法

    所以我要把你们抛到最深处,但这里是我使用的参考资料

    -一篇关于同一事物的所有不同陈述/抽象的非常好的文章

    -微软文档

    -如何使用Linq方法和Lambda表达式查询列表

    -基本上是另一个代表..C#现在有足够的这些了吗

    -泛型的力量

    在所有这些之后,你可能会问自己,为什么要使用泛型类网格?我怀疑你想要存储在单元格中的唯一东西是int。也许你想要存储一个表示各种事物的完整对象


    出于某种原因,您是否仅限于使用数组?其他明智的泛型ICollection类型更易于使用(如a).不,不限于只使用数组。我只是刚接触c#。不,我希望维度相同。至于列表,我会试试。@MichaelAlexander:那你到底想问什么?如果你让行数是动态的,并且你想让列数等于行数,那有什么问题吗?是的。最终目标是得到ob单元格中的对象。我试图做的是编写一些可以随机生成房间的基本代码。(1是房间,0不是)。一旦开始工作,(那时,希望我有一个实际的IDE,而不是Sololearn),我将努力使它们成为对象。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class Program
    {
        public static void Main()
        {
            Random rand = new Random(); 
            int num;
            num = Convert.ToInt32(Console.ReadLine());
            Func<int> valueGenerator = () => { return rand.Next(0,2); };
            var dungeon = new Grid<int>(num, num, valueGenerator);
    
            foreach(var row in dungeon.Rows)
            {
                // First() - https://msdn.microsoft.com/en-us/library/bb291976(v=vs.110).aspx
                if (row.First().Row == 0)
                {
                    Console.WriteLine("#-#-#-#-#");
                }
                // ToArray() - https://msdn.microsoft.com/en-us/library/bb298736(v=vs.110).aspx
                var rowValues = row.Select(r => r.Value.ToString()).ToArray();
    
                // string.Join() - https://msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspx
                var rowDisplay = string.Join("|", rowValues);
    
                // $ ie Interpolated Strings - https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interpolated-strings
                Console.WriteLine($"|{rowDisplay}|");
                Console.WriteLine("#-#-#-#-#"); 
            }
        }
    
        public class Grid<T>
        {
            private int _numberOfRows;
            private int _numberOfColumns;
    
            // List<> - https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx
            private List<Cell<T>> _cells;
    
            public Grid(int numberOfRows, int numberOfColumns)
            {
                if (numberOfRows == 0)
                    throw new ArgumentOutOfRangeException("numberOfRows must be greater than zero.");
                if (numberOfColumns == 0)
                    throw new ArgumentOutOfRangeException("numberOfColumns must be greater than zero.");
    
                _numberOfRows = numberOfRows;
                _numberOfColumns = numberOfColumns;
    
                // Enumerable.Range - https://msdn.microsoft.com/en-us/library/system.linq.enumerable.range(v=vs.110).aspx
                _cells = Enumerable.Range(0, _numberOfRows)
                    // Select - https://msdn.microsoft.com/en-us/library/bb548891(v=vs.110).aspx
                    .Select(r => Enumerable.Range(0, _numberOfColumns)
                            .Select(c => new Cell<T>
                                    {
                                        Row = r,
                                        Col = c
                                    })
                            // ToList() - https://msdn.microsoft.com/en-us/library/bb342261(v=vs.110).aspx
                            .ToList())
                    // - https://msdn.microsoft.com/en-us/library/system.linq.enumerable.selectmany(v=vs.110).aspx
                    .SelectMany(c => c)
                    .ToList();
            }
    
            public Grid(int numberOfRows, int numberOfColumns, Func<T> valueGenerator)
            {
                if (numberOfRows == 0)
                    throw new ArgumentOutOfRangeException("numberOfRows must be greater than zero.");
                if (numberOfColumns == 0)
                    throw new ArgumentOutOfRangeException("numberOfColumns must be greater than zero.");
    
                _numberOfRows = numberOfRows;
                _numberOfColumns = numberOfColumns;
    
                _cells = Enumerable.Range(0, _numberOfRows)
                    .Select(r => Enumerable.Range(0, _numberOfColumns)
                            .Select(c => new Cell<T>
                                    {
                                        Row = r,
                                        Col = c,
                                        Value = valueGenerator()
                                    })
                            .ToList())
                    .SelectMany(c => c)
                    .ToList();
            }
    
            public IEnumerable<ICell<T>> Cells
            {
                get
                {
                    return _cells;
                }
            }
    
            public IEnumerable<IEnumerable<ICell<T>>> Rows
            {
                get
                {           
                    return _cells.GroupBy(c => c.Row)
                        .Select(gs => gs.OrderBy(g => g.Col).ToList())
                        .ToList();
                }
            }
    
            public IEnumerable<IEnumerable<ICell<T>>> Columns
            {
                get
                {
                    return _cells.GroupBy(c => c.Col)
                        .Select(gs => gs.OrderBy(g => g.Row).ToList())
                        .ToList();
                }
            }
    
            // We expose the Interface because we don't want anyone outside grid modifying
            // Row or Col
            public interface ICell<T>
            {
                int Row { get; }
                int Col { get; }
                T Value { get; set; }
            }
    
            private class Cell<T> : ICell<T>
            {
                public T Value { get; set; }
                public int Row { get; set; }
                public int Col { get; set; }
            }
    
    
        }
    
    }
    
    #-#-#-#-#
    |0|0|0|1|
    #-#-#-#-#
    |1|0|0|1|
    #-#-#-#-#
    |0|0|1|0|
    #-#-#-#-#
    |0|1|1|0|
    #-#-#-#-#