C# 如何跳过矩阵每行的第一个元素?
我有下一个矩阵:C# 如何跳过矩阵每行的第一个元素?,c#,arrays,matrix,multidimensional-array,cycle,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
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++;
}
我需要跳过矩阵每行的第一个元素,并从每行的第二个元素写入数组结果,因为矩阵行的第一个元素只是行数。您应该改为使用(如果您需要知道哪一行/列)。
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
}
}
string[]fileLines=System.IO.File.ReadAllLines(@“input_5_5.txt”,Encoding.GetEncoding(1250));
对于(int line=0;line
关于如何实现这一点,有很多不同的方法,但您希望从1开始,而不是从0开始。那就是你缺少元素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++;
}
我建议直接跳过foreach
并使用常规for
循环。
在按空格修剪和拆分行之后,只需通过将索引初始化为1而不是0来跳过第一个元素
var cols=line.Trim().Split(“”)//使用“字符串拆分”选项删除空条目以增强健壮性
for(int j=1;j
注意-所有这些假设要么是已知数据格式正确,要么是您进行适当的边界和错误检查等。我针对这个问题的练习,尽管某些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");
}
[TestMethod]
公共无效LinqArraySkipFirstColumnAndLine()
{
变量inputString=@“跳过此行
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=新字符[]{'\n'};
char[]itemSeparator=新字符[]{''};
var lines=inputString.Split(行分隔符).Skip(1);
aresequal(5行,Count(),“预期5行”);
列表矩阵=新列表();
lines.ToList().ForEach(line=>{
int-dummy=0;
var items=line.Trim()
.拆分(项目分隔符,
StringSplitOptions.RemoveEmptyEntries)
.跳过(1);
Assert.AreEqual(5,items.Count(),“每行预期5项”);
var行=项。其中(c=>int.TryParse(c,out dummy))
.Select(w=>dummy).ToList();
矩阵。添加(行);
});
var元素=来自矩阵中的行
从行中的单元格
选择单元;
Assert.AreEqual(25,elements.Count(),“展平矩阵后预期25个元素”);
}
使用Linq方法跳过第一行。在每行中应用相同的值以跳过第一个元素。您还需要修复j
的用法,并可能相应地调整数组大小。您在哪里初始化i
?(对于循环,这里比foreach更好)您使用int[,]
而不是int[][]
?@flindeberg的原因是什么?因为数组的所有行都是相同长度的?@Sayse这确实是一个原因,但我在问OP:)这很可能会导致无效结果(如果不是例外的话)asj
不会每行重置。