如何跳过矩阵每行中的第一个元素
本文关键字:第一个 元素 何跳过 | 更新日期: 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");
}