C# 如何在不知道输入类型的情况下创建填充矩阵的方法

C# 如何在不知道输入类型的情况下创建填充矩阵的方法,c#,matrix,C#,Matrix,我想创建一个从控制台读取输入并填充它的方法,例如: 34 A、B、D E B B B I J B B 第一行读取尺寸,其余的是矩阵中的输入(中间没有空行,否则我无法粘贴)。 我写道: static void Main(string[] args) { var input = Console.ReadLine(); char[,] matrix = ReadAndFillMatrix(input); } private static cha

我想创建一个从控制台读取输入并填充它的方法,例如:

34

A、B、D

E B B B

I J B B

第一行读取尺寸,其余的是矩阵中的输入(中间没有空行,否则我无法粘贴)。 我写道:

  static void Main(string[] args)
    {
        var input = Console.ReadLine();
        char[,] matrix = ReadAndFillMatrix(input);
    }

  private static char[,] ReadAndFillMatrix(string input)
        {
            var size=input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray();
            var rows = size[0];
            var cols = size[1];
            var matrix = new char[rows, cols];
            for (int i = 0; i < rows; i++)
            {
                var line = Console.ReadLine()
               .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
               .Select(char.Parse)
               .ToArray();
                for (int j = 0; j < cols; j++)
                {
                    matrix[i, j] = line[j];
                }
            }

            return matrix;
        }
static void Main(字符串[]args)
{
var input=Console.ReadLine();
字符[,]矩阵=读取和填充矩阵(输入);
}
私有静态字符[,]ReadAndFillMatrix(字符串输入)
{
var size=input.Split(新字符[]{''},StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray();
变量行=大小[0];
var cols=大小[1];
var矩阵=新字符[行,列];
对于(int i=0;i
到目前为止还不错,但是当矩阵不是由字符组成,而是由整数组成时,我该怎么办呢

问题:我是否必须为每种类型的矩阵创建不同的方法,还是缺少一些东西


PS:我希望能够在不同矩阵的多个位置使用它,而不仅仅是一个

你非常接近!只需使用(或
int.TryParse
)测试您读过的每一部分,这样您就知道了;当然,例如,您需要为每种类型
char
int
创建不同的矩阵数组,但这应该不会太繁重


编辑 根据@kokosaish对这个答案的评论,我更新了以下内容:

void Main()
{
    var stringMatrix = ReadAndFillMatrix<string>(s => s);
    var intMatrix = ReadAndFillMatrix<int>(int.Parse);
    var doubleMatrix = ReadAndFillMatrix<double>(double.Parse);
}

private static T[,] ReadAndFillMatrix<T>(Func<string,T> sectionParser)
{
    var readAndSplit =
        new Func<string[]>(
            () =>
            {
                return
                Console.ReadLine()
                .Split(new char[] { ' '}, StringSplitOptions.RemoveEmptyEntries)
                .ToArray();
            });
            
    var size = readAndSplit();
    var rows = int.Parse(size[0]);
    var cols = int.Parse(size[1]);
    
    var matrix = new T[rows, cols];
    for (var i = 0; i < rows; i++)
    {
        var line = readAndSplit();
        for (var j = 0; j < cols; j++)
        {
            matrix[i,j] = sectionParser(line[j]);
        }
    }
    return matrix;
}
void Main()
{
var stringMatrix=ReadAndFillMatrix(s=>s);
var intMatrix=ReadAndFillMatrix(int.Parse);
var doubleMatrix=ReadAndFillMatrix(double.Parse);
}
私有静态T[,]ReadAndFillMatrix(Func sectionParser)
{
var readAndSplit=
新职能(
() =>
{
返回
Console.ReadLine()
.Split(新字符[]{“”},StringSplitOptions.RemoveEmptyEntries)
.ToArray();
});
var size=readAndSplit();
var rows=int.Parse(大小[0]);
var cols=int.Parse(大小[1]);
var矩阵=新的T[行,列];
对于(变量i=0;i

这远不是生产就绪代码,因为您需要为解析失败时添加错误处理等,但这应该说明如何指定所需的类型。

尝试创建类型为var的锯齿数组。检查此问题以了解解决方案


在该数组中,可以将每一行存储为一个新数组。这将在运行时发生,因此您可以执行TypeOf来查找确切的数据类型。或者您可以将其全部保留为var.

,但我需要指定我在方法中返回的类型。即使我发现矩阵是由int而不是char组成的,我已经声明该方法是char[,],这意味着我应该只返回char[,],不是吗?@kokosaish我已经更新了答案,这将允许您创建任意类型的矩阵,前提是您可以对该特定类型执行解析操作。使用泛型类型如何?比如说,一个变量?