C # Заполнить массив значениями в цикле - PullRequest
0 голосов
/ 23 октября 2018

У меня есть консольное приложение C #, где читается внешний текстовый файл.Каждая строка файла имеет значения, разделенные пробелами, такие как:

1 -88 30.1
2 -89 30.1

Таким образом, первая строка должна быть разбита на '1', '-88' и '30 .1 '.

Что мне нужно сделать, это заполнить массив (или любой другой лучший объект) так, чтобы он дублировал каждую строку;массив должен иметь 3 элемента в строке.Должно быть, у меня была блокировка мозга, чтобы не понять это сегодня.Вот мой код:

string line;
int[] intArray;
intArray = new int[3];
int i = 0;

//Read Input file
using (StreamReader file = new StreamReader("Score_4.dat"))            
{   
    while ((line = file.ReadLine()) != null && line.Length > 10)
    {                    
        line.Trim();
        string[] parts;
        parts = line.Split(' ');
        intArray[0][i] = parts[0];//error: cannot apply indexing
        i++; 
    }
}

В дальнейшем в моем коде я намереваюсь сделать несколько API-вызовов к серверу, создавая объект Json во время цикла по массиву (или альтернативному объекту).

Есть идеи?Спасибо

Ответы [ 5 ]

0 голосов
/ 23 октября 2018

Если вам нужно только передать данные в JSON, вам не нужно обрабатывать значения данных, просто переформатируйте их в массивы JSON.

Поскольку вы не знаете числострок во входном файле, проще использовать List <>, емкость которого увеличивается автоматически, для хранения данных, а не массива, размер которого вам нужно знать заранее.

Я взял ваш образецданные и повторили его несколько раз в текстовый файл и использовали эту программу:

static void Main(string[] args)
{
    string src = @"C:\temp\Score_4.dat";
    List<string> dataFromFile = new List<string>();
    using (var sr = new StreamReader(src))
    {
        while (!sr.EndOfStream)
        {
            string thisLine = sr.ReadLine();
            string[] parts = thisLine.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length == 3)
            {
                string jsonArray = "[" + string.Join(",", parts) + "]";
                dataFromFile.Add(jsonArray);
            }
            else
            {
                /* the line did not have three entries */
                /* Maybe keep a count of the lines processed to give an error message to the user */
            }
        }
    }

    /* Do something with the data... */
    int totalEntries = dataFromFile.Count();
    int maxBatchSize = 50;
    int nBatches = (int)Math.Ceiling((double)totalEntries / maxBatchSize);
    for(int i=0;i<nBatches;i+=1)
    {
        string thisBatchJsonArray = "{\"myData\":[" + string.Join(",", dataFromFile.Skip(i * maxBatchSize).Take(maxBatchSize)) + "]}";
        Console.WriteLine(thisBatchJsonArray);
    }

    Console.ReadLine();
}

, чтобы получить этот вывод:

{"myData": [[1, -88, 30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1,-88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1],[2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88, 30,1], [2, -89,30,1], [1, -88,30,1], [2, -89,30.1]]}
{"myData": [[1, -88,30.1],[2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88, 30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1], [1, -88,30.1], [2, -89,30.1]]}

Должно быть легко настроить формат в соответствии с требованиями.

0 голосов
/ 23 октября 2018

Проблема в том, что массив int является одномерным.

Мое предложение заключается в том, что вы можете поместить класс с 3 свойствами и заполнить список классов там.Лучше иметь класс с теми же именами свойств, которые требуются для сборки JSON.Так что вы можете легко сериализовать этот класс в JSON, используя некоторые нюансы, такие как Newtonsoft, и легко выполнять вызовы API.

0 голосов
/ 23 октября 2018

Так как есть числа типа 30.1, поэтому int для этого не подходит, и также это должно быть не double[], а double[][]:

string[] lines = File.ReadAllLines("file.txt");
double[][] array = lines.Select(x => s.Split(' ').Select(a => double.Parse(a)).ToArray()).ToArray();
0 голосов
/ 23 октября 2018

Я бы создал пользовательский класс Item, а затем заполнил бы список для легкого доступа и сортировки отдельными элементами.что-то вроде:

 public Class MyItem
 {
     public int first { get; set; }
     public int second { get; set; }
     public float third { get; set; }

     public MyItem(int one, int two, float three)
     {
         this.first = one;
         this.second = two;
         this.third = three;
     }
}

тогда вы можете сделать:

List<MyItem> mylist = new List<MyItem>();

и затем в вашем цикле:

using (StreamReader file = new StreamReader("Score_4.dat"))            
{   
    while ((line = file.ReadLine()) != null && line.Length > 10)
    {                    
        line.Trim();
        string[] parts;
        parts = line.Split(' ');
        MyItem item = new Item(Int32.Parse(parts[0]),Int32.Parse(parts[1]),Float.Parse(parts[2]));
        mylist.Add(item);
        i++; 
    }
}
0 голосов
/ 23 октября 2018

Ваш массив int является одномерным массивом, но вы пытаетесь проиндексировать его как многомерный массив.Это должно быть что-то вроде этого:

intArray[i] = parts[0]

(Однако вам нужно будет выполнить преобразование в int для дробных частей)

В качестве альтернативы, если вы хотитечтобы использовать многомерный массив, вы должны объявить его.

int[][] intArray = new int[*whatever your expected number of records are*][3]

Массивы имеют статический размер.Поскольку вы читаете из файла и, возможно, не знаете, сколько существует записей, пока ваш файл не завершит чтение, я рекомендую использовать что-то вроде списка кортежей или словаря в зависимости от ваших потребностей.

Словарь позволитчтобы вы могли быстро просматривать свои записи, не просматривая их, используя пару ключ-значение, поэтому, если вы хотите, чтобы ваши записи соответствовали номерам их строк, вы можете сделать что-то вроде этого:

Dictionary<int, int[]> test = new Dictionary<int, int[]>();
int lineCount = 1;
while ((line = file.ReadLine()) != null && line.Length > 10)
   {
      int[] intArray = new int[3];
      line.Trim();
      string[] parts = line.Split(' ');
      for (int i = 0; i < 3; i++)
          {
               intArray[i] = int.Parse(parts[i]);
          }
      test[lineCount] = intArray;
      lineCount++;

  }

Этопозволит вам получить доступ к вашим значениям по количеству строк следующим образом:

test[3] = *third line of file*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...