Преобразовать строки в числа с плавающей запятой или двойные из списка - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь преобразовать все числа из списка строк в число с плавающей точкой. Я не уверен, почему все элементы из списка являются символами, и он преобразует каждый ди git в символ вместо преобразования числа до пробела. Ниже приведен код. Если первый вход равен 2, он создаст 2 списка, скажем, 12 23 33 и 22 33 44.

. Из списка 1 мне нужно, чтобы mm было 12/23/33 вместо 1/2/2/3/3/3

int nrMagazine = Convert.ToInt32(Console.ReadLine());

List<String> mag = new List<String>();

string prop = "";
for(int i = 0; i < nrMagazine;i++)
{
    string profitTrimestre = Console.ReadLine();
    profitTrimestre.Split();
    mag.Add(profitTrimestre);

    //cel mai profitabil trimestru,trimestru 1 = m[0],1=m[1]
    //cel mai profitabil magazin,mag 1,2,3,4,n
}
foreach(string m in mag)
{
    foreach(string mm in m)
    {
        Console.WriteLine(mm);
    }
}

Ответы [ 5 ]

0 голосов
/ 04 марта 2020

Я думаю, это то, что вам нужно.

        Dictionary<int, IEnumerable<float>> nrMagazine = new Dictionary<int, IEnumerable<float>>(); //creates dictionary

        int.TryParse(Console.ReadLine(), out int x); //input number for iterations here

        for (int i = 0; i < x; i++)
        {
            nrMagazine.Add(i, Console.ReadLine().Split(' ').Select(s => { float.TryParse(s, out float y); return y; })); //builds floats list and adds it to dictionary x times
        }

        nrMagazine.Keys.ToList().ForEach((i) => Console.WriteLine("Magazine: " + i + ", Profits:  " + String.Join(", ", nrMagazine[i]))); //prints items from dictionary 
0 голосов
/ 04 марта 2020

profitTrimestre.Split(); вернет массив, который в настоящее время вы ничего не делаете с ним. Попробуйте изменить это вместо этого:

Console.WriteLine("Insert the number of lists: ");
if(int.TryParse(Console.ReadLine(),out int nrMagazine)) //Never trust user's inputs
{
    List<string> mag = new List<string>();

    for(int i = 0; i < nrMagazine;i++)
    {
        Console.WriteLine($"Insert List {i+1}: ");
        mag.Add(Console.ReadLine());    
    }
    foreach(string m in mag) //iterates over each input string
    {
        foreach(string mm in m.Split(' ')) //splits each entry and iterates over the itens
        {
            Console.WriteLine(mm);
            if(double.TryParse(mm, out double myDouble)) //You can also pass a Culture
            {
                //Do something with your double
            }
            else
            {
                //Input not a double in the current culture
            }
        }
    }
}
else
{
    Console.WriteLine("The input was not an integer");
}
0 голосов
/ 04 марта 2020

Есть несколько проблем в вашем текущем коде.

Я не уверен, почему все элементы из списка char

Поскольку у вас есть другой l oop для строки, которая неявно использует перечислитель, повторяет строку за символом. Вы должны быть в состоянии преобразовать в число с плавающей точкой, используя Convert class:

foreach(string m in mag)
{
    var number = Convert.ToDouble(m);
}

Во-вторых, если числа разделены пробелом, используйте перегрузку Split, которая принимает символ для разделения:

var splitted = profitTrimestre.Split(new char[]{' '}, StringSplitOption.RemoveEmptyEntries);

, а затем l oop:

foreach(var item in splitted)
  mag.Add(item);
0 голосов
/ 04 марта 2020

вы можете попробовать это

    public static void Main(string[] args)
    {
        var text = Console.ReadLine();
        var strings = text.Split(' '); // This splits the 11 22 33 to three string values.
        var numbers = strings.Select(a =>
        {
            if (float.TryParse(a, out float number))
                return number;
            return 0;
        }).ToList(); // This converts 3 strings to 3 float
    }

Или вы можете попробовать самую короткую версию (благодаря Прасаду Телкикару)

    public static void Main(string[] args)
    {
        var numbers = Array.ConvertAll(Console.ReadLine().Split(' '), x => float.TryParse(x, out float number) ? number : 0);
    }
0 голосов
/ 04 марта 2020

Может быть, вам просто нужно вместо этого разделить вашу строку на пробелы и фактически присвоить значение разбиения mag?

string[] mag = profitTrimestre.Split(' ');

Тогда вы сможете использовать l oop для каждой строки в этом списке с помощью всего лишь один foreach:

foreach(string m in mag)
{
    Console.WriteLine(m);
}

Если вы хотите преобразовать отдельные части строки в двойные, вы можете сделать это следующим образом:

double d = double.Parse(m);

Вы также можете сделать это следующим образом, если вы хотите избежать исключений, если строки не являются допустимыми двойными представлениями:

double.TryParse(m, out double d);
...