#c#
Вопрос:
Я пытаюсь создать простую программу для преобразования строки, такой как «[0.00, 2277, 1827, 1840, 1, 1247, 1238, 993]» к числовому массиву, над которым я затем смогу немного посчитать. Тем не менее, я получаю сообщение об ошибке, что «Входная строка была не в правильном формате».
Может ли кто-нибудь указать, где я ошибся? Извините, я здесь совсем новичок.
using System;
namespace ColorConverter
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter color cal curve: ");
string input12BitLine = Console.ReadLine();
float[] fltCalTable = Array.ConvertAll(input12BitLine.Split('[', ' ', ',', ']'), float.Parse); //error is here
}
}
}
Комментарии:
1. Ввод здесь, по-видимому, JSON. Так почему бы не использовать синтаксический анализатор JSON для десериализации этого в float[] для вас?
Ответ №1:
Как это выглядит, вы передаете массив JSON в качестве входных данных. Используйте анализатор JSON для анализа входной строки JArray
, а затем преобразуйте каждый элемент в float.
using Newtonsoft.Json.Linq;
....
var result = JArray.Parse(input12BitLine).Select(x => x.Value<float>());
Console.WriteLine(string.Join(Environment.NewLine, result));
Альтернативные решения
Вы получаете эту ошибку, потому что она пытается проанализировать пустые строки, которые генерируются после разделения массива на '[', ' ', ',', ']'
. Если вы хотите использовать все эти разделители, используйте StringSplitOptions.RemoveEmptyEntries
их для удаления пустых строк из массива.
float[] fltCalTable = Array.ConvertAll(input12BitLine.Split(new char[] {'[', ' ', ',', ']'}, StringSplitOptions.RemoveEmptyEntries), float.Parse);
Сначала вам нужно Trim
заключить квадратные скобки, а затем преобразовать их в плавающие, разделив каждый элемент с помощью ,
разделителя
//Readable solution
string input12BitLine = Console.ReadLine();
var floatArray = input12BitLine.Trim(new char[]{ '[', ']'}) //Remove square brackets
.Split(',') //Split string by ','
.Select(float.Parse) //Parse each element to float
.ToArray(); //Convert to Array
Или с помощью Array.ConvertAll()
float[] fltCalTable = Array.ConvertAll(input12BitLine.Trim(new char[]{ '[', ']'}).Split(','), float.Parse);
POC: СКРИПКА .NET
Комментарии:
1. OP пытается проанализировать JSON вручную… Действительно не понимаю, почему вы поддерживаете их в этом странном путешествии.
2. так ли это? Я вижу, что ОП считывает строку с консоли? да, ОП, возможно, печатает Джаррея на консоли
3. Я согласен, что очень необычно иметь «[ ]» во входных данных, введенных пользователем… но это то, о чем просит ОП…
4. @AlexeiLevenkov, я обновил свой ответ, чтобы использовать
JArray
и преобразовать его в float
Ответ №2:
Вам нужно отфильтровать пустые строки.
float[] fltCalTable = Array.ConvertAll(input12BitLine.Split('[', ' ', ',', ']').Where(x => !string.IsNullOrWhiteSpace(x)).ToArray(), float.Parse);
Комментарии:
1. Вы можете использовать
StringSplitOptions.RemoveEmptyEntries
значение перечисления вместо предложения Where. Это улучшит ваш запрос linq, пропустив еще один цикл for