Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何跳过矩阵每行的第一个元素?_C#_Arrays_Matrix_Multidimensional Array_Cycle - Fatal编程技术网

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:)这很可能会导致无效结果(如果不是例外的话)as
j
不会每行重置。