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

本文关键字:第一个 元素 何跳过 | 更新日期: 2023-09-27 18:22:14

我有下一个矩阵:

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,因为矩阵行中的第一个元件只是行数。

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

您应该使用(如果您需要知道哪行/哪列)。由于不需要第一列,所以用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
    }
}

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

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

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

关于如何做到这一点有很多变化,但您希望从1开始j,而不是0。那就是你缺少了元素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++;
}

我对这个问题的练习,尽管一些Linq仍然可能短路,但这可能更清楚:

    [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");
    }