如何跳过矩阵的每一行中的第一个元素?

时间:2014-09-18 07:05:02

标签: c# arrays matrix multidimensional-array cycle

我有下一个矩阵:

1 4 2 1 3 5
2 3 1 2 4 5
3 4 5 3 2 1
4 5 1 3 4 2
5 3 2 4 5 1

我正在从文本文件写入2d数组,从本周期文件的第二行开始:

foreach (var line in File.ReadAllLines(@"input_5_5.txt", Encoding.GetEncoding(1250)).Skip(1))
            {
                    foreach (var col in line.Trim().Split(' '))
                    {
                        result[i, j] = int.Parse(col.Trim());
                        j++;
                    }
                    i++;
            }

我需要在每行矩阵中跳过第一个元素,并从每行第二个元素写入数组result,因为矩阵行中的第一个元素只是行数。

4 个答案:

答案 0 :(得分:1)

您应该使用(如果您需要知道哪一行/列)。 Col初始化为1,因为您不需要第一列。

string[] fileLines = System.IO.File.ReadAllLines(@"input_5_5.txt", Encoding.GetEncoding(1250));
for(int line = 0; line < fileLines.Length; line++)
{
    string[] splittedLines = fileLines[line].Trim().Split(' ');
    for(int col = 1; col < splittedLines.Length; col++)
    {
        // do whatever you want here
    }
}

答案 1 :(得分:1)

我建议您只需跳过foreach并使用常规for循环。 在按空格修剪和分割线之后,只需通过将索引初始化为1而不是0来跳过第1个元素。

var cols = line.Trim().Split(' '); //use string split option to remove empty entries for robustness

for (int j = 1; j < cols.Length; j++) //note the j is initialized with 1, instead of 0

注意 - 所有这些都假设已知数据格式正确,或者您进行了适当的边界和错误检查等。

答案 2 :(得分:0)

关于如何做到这一点有很多变化,但是你想以1而不是0开始j。那你是否错过了元素0,我相信如果你追求的是什么,那么:

foreach (var line in File.ReadAllLines(@"input_5_5.txt", Encoding.GetEncoding(1250)))
{
    int j = 1;
    foreach (var col in line.Trim().Split(' '))
    {
        result[i, j] = int.Parse(col.Trim());
        j++;
    }
    i++;
}

答案 3 :(得分:0)

我对这个问题的练习,虽然一些Linqs仍然可以短路,但这可能更清楚:

    [TestMethod]
    public void LinqArraySkipFirstColumnAndLine()
    {
        var inputString = @"SkipThisLine
                            1 4 2 1 3 5
                            2 3 1 2 4 5 
                            3 4 5 3 2 1
                            4 5 1 3 4 2
                            5 3 2 4 5 1";

        char[] lineSeparator = new char[] { '\n' };
        char[] itemSeparator = new char[] { ' ' };

        var lines = inputString.Split(lineSeparator).Skip(1);
        Assert.AreEqual(5, lines.Count(), "Expect 5 rows");

        List<List<int>> matrix = new List<List<int>>();

        lines.ToList().ForEach(line => {
            int dummy = 0;
            var items = line.Trim()
                            .Split(itemSeparator,
                                   StringSplitOptions.RemoveEmptyEntries)
                            .Skip(1);
            Assert.AreEqual(5, items.Count(), "Expect 5 items each row");

            var row = items.Where(c => int.TryParse(c, out dummy))
                           .Select(w => dummy).ToList();
            matrix.Add(row);
        });

        var elements = from row in matrix
                       from cell in row
                       select cell;
        Assert.AreEqual(25, elements.Count(), "Expect 25 elements after flattening matrix");
    }