Member 13488719 Ответов: 4

У меня есть строковый массив, и я хочу выполнить некоторую операцию, когда он имеет тип datetime, и если это не другая операция, которую я хочу выполнить.


У меня есть массив строк .которые имеют два типа значений Double и DateTime .И я хочу выполнить какую-то операцию, когда на первый индекс Datetime приходит еще одна операция.

строка receivedData="77.6867#25.437#2018.01.08 14:58:28#12.8241#77.6867#25.375#2018.01.08 14:58:28#12.8241#77.6867#25.437#2018.01.08 14:58:346#25.437#2018.01.08 15:03:20#12.8241#77.6866#25.437#2018.01.08 1#25.437#2018.01.08 14:24:06#12.8241#77.6866#25.312#2018.01.08 14:24:06#12.8241#77.6866#25.375#2018.01.08 14:24:06#12.8241#77.6866#25.375#2018.01.08 14:24:06#12.8241#77.6866#25.375#2018.01.08 14:24:06#12.8241#77.6866#25.375#2018.01.08 14:24:06#12.8241#77.6866#25.375#2018.01.08 14:24:12#12.8241#77.6866#25.375#2018.01.08 14:24:12#12.8241#77.6866#25.375#2018.01.08"
После удаления делеметра .Я всегда хочу, чтобы 2-й элемент массива имел значение Datetime.

Что я уже пробовал:

Нить.Сон(10000);
Последовательный порт СП = (последовательный порт)отправителя;
serialPortData = sp.ReadExisting();
int indx = serialPortData.Помощи indexOf("#");
serialPortData = serialPortData.Remove(0, indx + 1);
string[] Data = serialPortData.Split(новая строка[] { "#" },
StringSplitOptions.RemoveEmptyEntries);
в то время как(данные[1].GetType()!=typeof(System.значение datetime))
{
Data = Data.Skip(1).Метод toArray();
}
этот код не показывает никаких ошибок.
когда я помещаю "==" внутрь цикла while, он выходит из цикла для всех значений.
когда я помещаю "!=" внутрь цикла while, он продолжает выполнять один и тот же цикл до последнего.
заранее благодарю вас.

Dotnet_Dotnet

Сэр магазине в строковый массив с помощью Split функции, что и сделал .
в p =0,I=0;
В то время как(я И Л;массив.длина)
{
если(p==2)
{
Ура получилось
Р=0
}
Я++;
}

4 Ответов

Рейтинг:
2

F-ES Sitecore

Используйте DateTime.ParseExact, чтобы узнать, можно ли преобразовать текст в datetime в определенном формате.

DateTime dt;
while (DateTime.TryParseExact(Data[1], "yyyy.MM.dd HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out dt))


Однако у вас, вероятно, есть и другие логические ошибки в вашем коде.


Рейтинг:
1

Jochen Arndt

Data это string таким образом, значение returnd по Data[1].GetType() это никогда не то же самое, что typeof(System.DateTime).

Вы должны попытаться преобразовать строки в a double и-или DateTime чтобы проверить, какие данные получены. Видеть
Двойной.Метод TryParse (String, NumberStyles, IFormatProvider, Double) (System)[^] и значение datetime.Метод Метод Tryparseexact (Строка, Строка, Объекта Iformatprovider, DateTimeStyles, Датавремя) (Система)[^] :

DateTime dt;
if (DateTime.TryParseExact(Data[1], "yyyy.MM.dd hh:mm:ss", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, dt)) 
{
    // Is a DateTime
}

double dVal;
// en-US for the period as decimal point
CultureInfo enUS = new CultureInfo("en-US"); 
// You might need to add styles or change it (e.g. for leading sign)
if (Double.TryParse(Data[1], NumberStyles.AllowDecimalPoint, enUS, dVal)) 
{
    // Is a double
}


Karthik_Mahalingam

5

Рейтинг:
1

johannesnestler

после

string[] Data = serialPortData.Split(new string[] { "#" }, 

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


по каждому элементу(строка strData в данных)
{
... для каждого второго элемента или каждого элемента, который может быть преобразован
DtData датавремя = Датавремя.Parse(strData); // или используйте tryparse, если не shure
}


Рейтинг:
0

GenJerDan

Я бы просто повторил анализируемую строку и использовал DateTime.TryParse(Data[x]) - если он анализирует, выполните действие DateTime, если нет, выполните двойное действие. Это предполагает, что анализируемая строка будет только содержат DateTimes или Double, потому что все, что не является DateTime, будет рассматриваться как Double.