如何在不知道大小的情况下在 C# 中创建多维数组

问题描述 投票:0回答:4

我需要在实际层面上了解如何在不知道大小的情况下在 C# 中创建矩阵[][]。 因此还有如何修改它(根据搜索键删除元素)。

我有一个示例循环。两个随机字符串变量。然后我就无法继续了......

private static Random random = new Random();

for (int i=0; i<unKnown; i++){
    var firstVar = RandomString(5);
    var secondVar = RandomString(20);

    //Matrix[][]
}


public static string RandomString(int length){
    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    return new string(Enumerable.Repeat(chars, length)
    .Select(s => s[random.Next(s.Length)]).ToArray());
}

谢谢你

c# arrays matrix
4个回答
2
投票

数组的大小是固定的。它们不会自动调整大小。例如。大小是在创建数组时定义的

string[] array = new string[10];

如果您的数组是二维 (10x10) 且您删除 (1:1) 处的值,则数组仍保留 10x10,但 1:1 处的字段现在为空。

如果您需要调整其大小的解决方案,您可能需要研究列表。

否则,我建议您阅读文档


1
投票

这真的取决于你想做什么。

如果您想要一个二维值数组,您可以使用多维数组。这支持任意维度,但对于更多维度,数据大小往往会增加,其他解决方案可能更可取:

var matrix = new double[4, 2];

如果您想做数学,您可能需要使用像 Math.Net 这样具有专门矩阵类型的库:

var matrix = Matrix<double>.Build.Dense(4, 2);

如果您想做计算机图形,您可能需要使用专门的库,例如 system.Numerics.Matrix4x4

var matrix = new Matrix4x4();

创建自己的包装常规数组的矩阵类也不是特别困难。这样做的好处是互操作性通常更容易,因为大多数框架和工具都接受指针或一维数组,而很少可以处理多维数组。索引可以这样完成:

    public class MyMatrix<T> 
    {

        public int Width { get; }
        public T[] Data { get; }
        public T this[int x, int y]
        {
            get => Data[y * Width + x];
            set => Data[y * Width + x] = value;
        }
     }

还有锯齿状数组,但不能保证这些将是“正方形”,因此如果您想要“矩阵”,它们可能不合适。

在所有情况下,如果您想要进行任何类型的替换,您都需要遍历矩阵并检查每个元素。有些替代方案需要单独的宽度/高度循环,而有些则允许单个循环。


0
投票

我不确定你想要一个矩阵还是一个数组。

矩阵就像

string[,] matrix = new string[10, 10];

数组就像

string[] array = new string[10];

您可以使用

array[i]
访问数组,使用
matrix[i, j]

访问矩阵

您还可以使用

List<List<string>> matrix = new List<List<string>>();
使用起来可能更方便,也可以通过索引器访问。例如

matrix[i][j] = "bob";
matrix[i].RemoveAt(j);

鉴于您提交的问题,也许只需

List<string>
就适合您。


© www.soinside.com 2019 - 2024. All rights reserved.