PDA

Просмотр полной версии : Преобразование стройки в список List<double> в скрипте C# MasterScada



groom
17.02.2022, 11:27
Ребята, приветствую! Я начинающий в C#, поэтому прошу у вас совета. Имеется представленный ниже код. Задача состоит в том, чтобы взять строковую переменную, которую будет вводить оператор компьютера (n-ое количество значений через запятую и пробел), разобрать на список List<double>, чтобы использовать эти значения вместо списка "new List<double> { 0, 79.8491, ... 9999 }". Пытался через "sample1.Split(',').Select(val => Convert.ToDouble(val)).ToList()", но через него код не хочет работать, хотя и проходит компиляцию. Может ест me кого какие идеи?


using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using FB.FBAttributes;
using System.Linq;


using System;
using System.Collections.Generic;


[FBRetain]
public partial class ФБ : ScriptBase
{


public override void Execute() {

List<double> height = new List<double> { 0, 79.8491, 106.5155, 157.1572, 235.2096, 318.5623, 390.807, 424.9339, 569.5301, 677.4991, 800.0812, 9999 };
List<double> age = new List<double> { 2157.251364, 2157.251364, 2163.506142, 2163.074778, 2157.682728, 2154.66318, 2153.153406, 2152.290678, 2153.153406, 2154.878862, 2157.89841, 2157.89841 };

//var sample1 = "80.6376, 105.9068, 156.5394, 234.7748, 318.403, 391.3434, 425.3548, 565.7305, 678.4589, 801.8177";
//var sample2 = "2250.015025, 2252.720725, 2256.10285, 2255.6519, 2255.6519, 2258.583075, 2257.230225, 2243.47625, 2261.739725, 2267.602075";
//var height = sample1.Split(',').Select(val => Convert.ToDouble(val)).ToList();
//var age = sample2.Split(',').Select(val => Convert.ToDouble(val)).ToList();

double x = ЗначениеРасхода.Value;
double y = linearInterpolation(height, age, x);
РассчитанныйКоэфициентПоЛинИнтерп = linearInterpolation(height, age, x);
}


public static double linear_interpolation_two_points(
double x1,
double y1,
double x2,
double y2,
double x) {
double y = (x - x1) * (y1 - y2) / (x1 - x2) + y1;
return y;
}



public static double linearInterpolation(
List<double> xValue,
List<double> yValue,
double x ) {

for (int i = 0; i < xValue.Count - 1; i++) {

if (xValue[i] <= x && x <= xValue[i + 1]) {
double x1 = xValue[i];
double x2 = xValue[i + 1];
double y1 = yValue[i];
double y2 = yValue[i + 1];
return linear_interpolation_two_points(x1, y1, x2, y2, x);
}
}
//System.Console.WriteLine( "Значение расхода вне диапазона" );
throw new ArgumentException("Вне диапазона");
}

}

SCADAMaster
17.02.2022, 12:07
У вас строка с ошибками - во первых пробел убрать, во вторых указать что преобразование с учетом точки идет
using System.Globalization;
var height = sample1.Replace(" ","").Split(',').Select(val => Double.Parse(val,CultureInfo.InvariantCulture)).To List();

groom
28.02.2022, 13:44
Спасибо за ответ! Попробовал. Выдает ошибку "(CS1002) ожидалась ;" в строках "var height = ..." и "var age = ...". Не могу понять, что не нравится компилятору, где должна быть ";".


public override void Execute() {
var sample1 = "80.6376, 105.9068, 156.5394, 234.7748, 318.403, 391.3434, 425.3548, 565.7305, 678.4589, 801.8177";
var sample2 = "2250.015025, 2252.720725, 2256.10285, 2255.6519, 2255.6519, 2258.583075, 2257.230225, 2243.47625, 2261.739725, 2267.602075";
var height = sample1.Replace(" ","").Split(',').Select(val => Double.Parse(val,CultureInfo.InvariantCulture)).To List();
var age = sample2.Replace(" ","").Split(',').Select(val => Double.Parse(val,CultureInfo.InvariantCulture)).To List();
double x = ЗначениеРасхода.Value;
double y = linearInterpolation(height, age, x);
РассчитанныйКоэфициентПоЛинИнтерп = linearInterpolation(height, age, x);
}


Проблему нашел - ToList пишется слитно. Может кто-то столкнется с этой задачей в будущем.