Huyyhaha Ответов: 2

Как это не подстрока, когда значение = null ?


У меня есть несколько проблем для подстроки в C# как подстрока, когда значение = null и подстрока позиции, которую вы хотите в строке
Пожалуйста, помогите мне решить эту проблему! Большое спасибо !

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

у меня есть код абзаца
string str = "";
string str1 = "";
string str2 = "";
string str3 = "";
string str4 = "";
string str5 = "";
str = data2.SThe;
if (str != null)
{
    str1 = str.Substring(0, 3);
    str2 = str.Substring(3, 2);
    str3 = str.Substring(5, 2);
    str4 = str.Substring(7, 3);
    str5 = str.Substring(10);

    xrSTbhyt1.Text = str1;
    xrBHYT2.Text = str2;
    xrBHYT3.Text = str3;
    xrBHYT4.Text = str4;
    xrBHYT5.Text = str5;
}
else
{
    str = string.Empty;
}

Gerry Schmitz

""это не то же самое, что null (если вам интересно); это то же самое, что string.Пустой.

И ваша программа будет терпеть неудачу каждый раз, когда длина data2.Стхе меньше 11 лет.

Huyyhaha

Правильно! как это не подстрока, когда значение равно ""

PIEBALDconsult

Проверьте длину .

2 Ответов

Рейтинг:
2

BillWoodruff

Идея защитного программирования состоит в том, чтобы заранее обрабатывать распространенные ошибки, и она основана на тревожном :) факте, что будут ошибки ... ваши и те, которые ваши конечные пользователи находят с их неожиданным поведением. Лучше бы ты их нашел !

.NET/C# предоставляет несколько средств, которые обрабатывают распространенные ошибки при доступе к общим структурам данных, разборе строк на числовые типы и т. д. Они выражаются с помощью семантики функций, таких как 'TryGetValue, 'TryParse, которые выполняют некоторую операцию и возвращают логическое значение, указывающее на успех или неудачу операции.

Итак, давайте напишем функцию с аналогичной семантикой для обработки получения подстроки:

using System;

namespace YourNameSpace
{
    public static class StringExtensions
    {
        public static bool TryGetSubString(this string str,  out string substring, uint start = 0, uint howmany = 0, bool dothrowerrors = false)
        {
            bool result = false;
            substring = null;

            if (string.IsNullOrEmpty(str))
            {
                if (dothrowerrors)
                {
                    throw new ArgumentException($"'{nameof(str)}' cannot be null or empty", nameof(str));
                }
                else
                {
                    return result;
                }
            }

            int len = str.Length - 1;

            if (howmany == 0 || start > len || start + howmany > len)
            {
                if (dothrowerrors)
                {
                    throw new ArgumentException($"'{nameof(str)}' is not long enough for these indexes", nameof(str));
                }
                else
                {
                    return result;
                }   
            }

            substring = str.Substring((int) start, (int) howmany);

            return true;
        }
    }
}
Записи:

1) используя тип 'uint для параметров index/length, мы предотвращаем ввод отрицательного int.

2) мы используем метод расширения, предложенный C# >= 3.0 здесь

Пример использования:
private string test = "0123456";

// in some method or eventhandler
if (test.TryGetSubString(out string sresult, 5,1))
{
     // success: 'sresult contains "6"
}
else
{
     // fail: 'sresult contains "null   
}


Рейтинг:
16

Sandeep Mewara

Как правило, в таких случаях, как ваш, если значение равно null, вы предоставляете значение по умолчанию. Похоже, он уже есть в вашем коде.

Альтернатива вашему коду:

string str = "";
str = data2?.SThe;

// You can add this if you want 
//if(string.IsNullOrEmpty(str))
//  return;

// If null default to empty
xrSTbhyt1.Text = str?.Substring(0, 3) ?? "";;
xrBHYT2.Text = str?.Substring(3, 2) ?? "";;
xrBHYT3.Text = str?.Substring(5, 2) ?? "";;
xrBHYT4.Text = str?.Substring(7, 3) ?? "";;
xrBHYT5.Text = str?.Substring(10) ?? "";;

PS: Как уже указывалось, этот код предполагает длину текста не менее 10 символов. Вы должны обработать этот usecase, чтобы избежать ошибки (если возвращаемый текст имеет меньшую длину)


Huyyhaha

я проверял его, все в порядке со строкой.IsNullOrEmpty(str) также с

xrSTbhyt1.Text = str?.Substring(0, 3) ?? "";;
xrBHYT2.Text = str?.Substring(3, 2) ?? "";;
xrBHYT3.Text = str?.Substring(5, 2) ?? "";;
xrBHYT4.Text = str?.Substring(7, 3) ?? "";;
xrBHYT5.Text = str?.Substring(10) ?? "";;

только не так