我希望数组的大小是动态的
因此,如果您对通用集合没有限制,我强烈建议您使用 List。忽略清理用户输入的更好方法,使用列表的代码可能如下所示。由于我们使用的是面向对象的语言,因此最好创建代表我们需要的对象(单元格、网格等)。然后从这些对象(行、列、值)中创建表示我们需要的东西的属性或方法。
所以我要把你扔到最深处,但这里是我正在使用的参考。
Delegates, Anonymous Methods, and Lambda Expressions。 - 一篇关于同一事物的所有不同陈述/抽象的非常好的文章。
Lambda expressions () => - Microsoft Docs。
Lambda expressions in a Query - 如何使用带有 Lambda 表达式的 Linq 方法查询列表。
Func(TResult) - 基本上是另一个代表.. C# 现在有足够的这些吗?
Generic Classes; MyClass - 泛型的力量!
DotNetFiddle Example.
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 和 1 是随机的,所以...)
4
#-#-#-#-#
|0|0|0|1|
#-#-#-#-#
|1|0|0|1|
#-#-#-#-#
|0|0|1|0|
#-#-#-#-#
|0|1|1|0|
#-#-#-#-#
在所有这些之后,您可能会问自己,为什么要使用通用类 Grid?好吧,我怀疑您想存储在 Cell 中的唯一内容是 int。也许您想存储一个代表各种事物的完整对象...
int Replaced with DungeonCell<>