格式化为Matrix表单

时间:2015-11-07 23:51:25

标签: c# string parsing matrix split

我尝试使用msdn上的代码:它使用foreach并将每个元素放在不同的行上。

我如何将其置于3x3矩阵格式?

char[] delimiterChars = { ' ', ',', '.', ':', '\t' ,'[' ,']', ';', '"', 'A', '=' };

string text = "A = [5 4 1; 3 6 1; 2 3 9]";
System.Console.WriteLine("Original text: '{0}'", text);

string[] words = text.Split(delimiterChars);
System.Console.WriteLine("{0} words in text:", words.Length);

foreach (string element in words)
{
    System.Console.WriteLine(element);
}

// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();

提前致谢!

1 个答案:

答案 0 :(得分:0)

至少有两种方法可以做到这一点。

<强> 1

首先,您的示例将输出

  

文字中的17个字:

这是因为当您按照所有指定的字符分割字符串时,您会获得许多空字符串,要删除它们,请将StringSplitOptions.RemoveEmptyEntries选项添加到Split方法。

string[] words = text.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);

现在你会得到

  

文字中的9个字:

您可以使用简单的for循环获得3 x 3矩阵,例如

string[,] matrix = new string[3, 3];
for (int i = 0; i < 3; ++i) 
{
    for(int j = 0; j < 3; ++j) 
    {
        matrix[i, j] = words[i * 3 + j];
    }
}

但是,您需要知道行数和列数(或假设矩阵是正方形)。 该方法看起来像这样

public static string[,] GetMatrix1(string text, int n, int m) 
{
    char[] delimiterChars = { ' ', ',', '.', ':', '\t' ,'[' ,']', ';', '"', 'A', '=' };
    string[] words = text.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);

    string[,] matrix = new string[n, m];
    for (int i = 0; i < n; ++i) 
    {
        for(int j = 0; j < m; ++j) 
        {
            matrix[i, j] = words[i * m + j];
        }
    }
    return matrix;
}

<强> 2

另一种方法是首先按[]分割文字,然后按;分割行以获取行,最后按(空格)分割文本行。

char[] delimiter1 = { '[', ']' };
char[] delimiter2 = { ';' };
char[] delimiter3 = { ' ' };
string[][] words = text.Split(delimiter1)[1]
                       .Split(delimiter2, StringSplitOptions.RemoveEmptyEntries)
                       .Select(x => x.Split(delimiter3, StringSplitOptions.RemoveEmptyEntries))
                       .ToArray();

您将获得string[][],每行的列数可能会有所不同,但如果您想要string[,]类型,则需要进行转换。 结果,实现将像这样

public static string[,] GetMatrix2(string text) 
{
    char[] delimiter1 = { '[', ']' };
    char[] delimiter2 = { ';' };
    char[] delimiter3 = { ' ' };
    string[][] words = text.Split(delimiter1)[1]
                           .Split(delimiter2, StringSplitOptions.RemoveEmptyEntries)
                           .Select(x => x.Split(delimiter3, StringSplitOptions.RemoveEmptyEntries))
                           .ToArray();

    string[,] matrix = new string[words.Length, words[0].Length];
    for(int i = 0; i < words.Length; ++i) 
    {
        for(int j = 0; j < words[i].Length; ++j)
        {
            matrix[i, j] = words[i][j];
        }
    }
    return matrix;
}