我有下一个矩阵:
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
,因为矩阵行中的第一个元素只是行数。
答案 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");
}