2014-09-18 3 views
0

У меня есть следующая матрица:Как пропустить первый элемент в каждой строке матрицы?

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

Вы пропустите первую строку, используя метод Linq. Примените одну и ту же * в * каждой строке, чтобы пропустить первый элемент. Вы также захотите исправить использование 'j' и, возможно, соответствующим образом настройте размеры массива. – user2864740

+1

Где вы инициализируете 'i'? (для циклов здесь было бы лучше вместо foreach) – Sayse

+0

В чем причина использования 'int [,]' вместо 'int [] []'? – flindeberg

ответ

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 
    } 
} 
+2

Это скорее всего приведет к недействительному результату (если не к исключению), поскольку 'j' никогда не будет сброшен за строку. – user2864740

+0

действительно. исправление прямо сейчас. – Whoami

0

Есть много вариантов, как это сделать, но вы хотите, чтобы начать J на ​​1 вместо 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++; 
} 
1

Я бы посоветовал просто пропустить foreach и использовать обычный for цикл. После обрезки и разделений построчно пространства (ов), просто пропустить 1-й элемент инициализации индекса 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

Примечание - Все это предполагает, что либо данные, как известно, хорошо сформированы, или вы делаете соответствующие оценки и проверки ошибок и т.д.

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"); 
    } 
Смежные вопросы