Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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语言中的字符串生成矩阵#_C#_String_Parsing_Matrix - Fatal编程技术网

C# 如何用c语言中的字符串生成矩阵#

C# 如何用c语言中的字符串生成矩阵#,c#,string,parsing,matrix,C#,String,Parsing,Matrix,我有字符串: string t=“{{1,3,23},{5,7,9},{44,2,3}” 我能用这样的字符串输入生成一个字符串矩阵吗? 我不能简单地分配: int [ , ] matrix = t 是否有一些函数可以使用,或者我必须以某种方式拆分字符串 PS:'t'字符串可以有不同数量的行和列。这应该可以满足您的需要 string t = "{ { 1, 3, 23 } , { 5, 7, 9 } , { 44, 2, 3 } }"; var cleanedRows = Regex.

我有字符串:
string t=“{{1,3,23},{5,7,9},{44,2,3}”

我能用这样的字符串输入生成一个字符串矩阵吗? 我不能简单地分配:

int [ , ] matrix = t
是否有一些函数可以使用,或者我必须以某种方式拆分字符串


PS:'t'字符串可以有不同数量的行和列。

这应该可以满足您的需要

string t = "{  { 1, 3, 23 } ,  { 5, 7, 9 } ,  { 44, 2, 3 }  }";

var cleanedRows = Regex.Split(t, @"}\s*,\s*{")
                        .Select(r => r.Replace("{", "").Replace("}", "").Trim())
                        .ToList();

var matrix = new int[cleanedRows.Count][];
for (var i = 0; i < cleanedRows.Count; i++)
{
    var data = cleanedRows.ElementAt(i).Split(',');
    matrix[i] = data.Select(c => int.Parse(c.Trim())).ToArray();
}
string t=“{1,3,23},{5,7,9},{44,2,3}”;
var cleanedRows=Regex.Split(t,@“}\s*,\s*{”)
.Select(r=>r.Replace(“{,”).Replace(“},”).Trim()
.ToList();
var矩阵=新整数[cleanedRows.Count][];
对于(var i=0;iint.Parse(c.Trim())).ToArray();
}

我提出了一些非常类似的想法,但有些测试用例您可能想考虑一下-希望它能有所帮助:

    private void Button_Click(object sender, RoutedEventArgs e)
    { 
        int[][] matrix;

        matrix = InitStringToMatrix("{  { 1, 3, 23 } ,  { 5, 7, 9 } ,  { 44, 2, 3 } }");
        matrix = InitStringToMatrix("{ {0,1,   2   ,-3 ,4}, {0} }");
        matrix = InitStringToMatrix("{} ");
        matrix = InitStringToMatrix("{ {}, {1} } ");
        matrix = InitStringToMatrix("{ { , 1,2,3} } ");
        matrix = InitStringToMatrix("{ {1} ");
        matrix = InitStringToMatrix("{ {1}{2}{3} }");
        matrix = InitStringToMatrix(",,,");
        matrix = InitStringToMatrix("{1 2 3}");
    }

    private int[][] InitStringToMatrix(string initString)
    {
        string[] rows = initString.Replace("}", "")
                                  .Split('{')
                                  .Where(s => !s.Trim().Equals(String.Empty))
                                  .ToArray();

        int [][] result = new int[rows.Count()][];

        for (int i = 0; i < rows.Count(); i++)
        {
            result[i] = rows[i].Split(',')
                               .Where(s => !s.Trim().Equals(String.Empty))
                               .Select(val => int.Parse(val))
                               .ToArray();
        }
        return result;
    }
private void按钮\u单击(对象发送者,路由目标)
{ 
int[][]矩阵;
矩阵=InitStringToMatrix(“{1,3,23},{5,7,9},{44,2,3}”);
矩阵=InitStringToMatrix(“{0,1,2,-3,4},{0}”);
矩阵=InitStringToMatrix(“{}”);
矩阵=InitStringToMatrix(“{{},{1}”);
矩阵=InitStringToMatrix(“{,1,2,3}”);
矩阵=InitStringToMatrix(“{1}”);
矩阵=InitStringToMatrix(“{{1}{2}{3}”);
矩阵=InitStringToMatrix(“,”);
矩阵=InitStringToMatrix(“{1 2 3}”);
}
私有int[]InitStringToMatrix(字符串initString)
{
string[]行=initString.Replace(“}”,“”)
.Split(“{”)
。其中(s=>!s.Trim().Equals(String.Empty))
.ToArray();
int[][]结果=新的int[rows.Count()][];
对于(int i=0;i!s.Trim().Equals(String.Empty))
.Select(val=>int.Parse(val))
.ToArray();
}
返回结果;
}

如果您喜欢优化,这里有一个只有一个表达式的解决方案:

string text = "{  { 1, 3, 23 } ,  { 5, 7, 9 } ,  { 44, 2, 3 }  }";

// remove spaces, makes parsing easier
text = text.Replace(" ", string.Empty) ;

var matrix = 
    // match groups
    Regex.Matches(text, @"{(\d+,?)+},?").Cast<Match>()
    .Select (m => 
        // match digits in a group
        Regex.Matches(m.Groups[0].Value, @"\d+(?=,?)").Cast<Match>()
        // parse digits into an array
        .Select (ma => int.Parse(ma.Groups[0].Value)).ToArray())
        // put everything into an array
        .ToArray();
string text=“{{1,3,23},{5,7,9},{44,2,3}”;
//删除空格,使解析更容易
text=text.Replace(“,string.Empty”);
var矩阵=
//比赛小组
Regex.Matches(text,@“{(\d+,?)+},”).Cast()
.选择(m=>
//匹配组中的数字
Regex.Matches(m.Groups[0].Value,@“\d+(?=,?)”).Cast()
//将数字解析为数组
.Select(ma=>int.Parse(ma.Groups[0].Value)).ToArray()
//排列
.ToArray();
基于,这里有一个函数,它返回一个
int[,]
而不是OP要求的
int[][]

public int[,] CreateMatrix(string s)
{
    List<string> cleanedRows = Regex.Split(s, @"}\s*,\s*{")
                                    .Select(r => r.Replace("{", "").Replace("}", "").Trim())
                                    .ToList();

    int[] columnsSize = cleanedRows.Select(x => x.Split(',').Length)
                                   .Distinct()
                                   .ToArray();

    if (columnsSize.Length != 1)
        throw new Exception("All columns must have the same size");

    int[,] matrix = new int[cleanedRows.Count, columnsSize[0]];
    string[] data;

    for (int i = 0; i < cleanedRows.Count; i++)
    {
        data = cleanedRows[i].Split(',');
        for (int j = 0; j < columnsSize[0]; j++)
        {
            matrix[i, j] = int.Parse(data[j].Trim());
        }
    }

    return matrix;
}
public int[,]CreateMatrix(字符串s)
{
List cleanedRows=Regex.Split(s,@“}\s*,\s*{”)
.Select(r=>r.Replace(“{,”).Replace(“},”).Trim()
.ToList();
int[]columnsize=cleanedRows.Select(x=>x.Split(',').Length)
.Distinct()
.ToArray();
if(columnsize.Length!=1)
抛出新异常(“所有列的大小必须相同”);
int[,]矩阵=新的int[cleanedRows.Count,columnsize[0]];
字符串[]数据;
for(int i=0;i
我认为您必须为该语法分析器构建自己的语法分析器。查看内置代码生成库,您的示例是3x3矩阵。矩阵是否始终为正方形?它是否可以是锯齿状的?即一行有3个,然后一行有2个…等等?