Создайте массив строк из более крупной строки после разграничения

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

private string strHeaderFileName;

protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
{
    strHeaderFileName = e.File.FileName;
    // etc.
}

protected void btnSave_Click(object sender, EventArgs e)
{
    // here you can access strHeaderFileName
}

Как члены класса, они будут доступны любой метод в этом классе. (Убедитесь, что вы сохранили их private или другие объекты также смогут получить к ним доступ, которые вам, вероятно, не нужны в этом случае.) И они будут существовать для жизни любого данного экземпляра этого класса.

Также обратите внимание, что это выглядит как ASP.NET, который ведет себя несколько иначе с точки зрения экземпляров класса, чем такие, как WinForms. Любой данный экземпляр Page не сохраняется между запросами. Поэтому, если вы установите значение в одном обработчике, снова отобразите страницу, а затем вызовите другой обработчик, значение больше не будет там. Это связано с тем, что экземпляр класса для каждого Page создается для каждого запроса и затем уничтожается после ответа.

Чтобы продолжить поиск по страницам, вам нужно сохранить значение где-то еще. Например, если ему нужно жить в рамках сеанса этого пользователя, вы можете поместить его в состояние сеанса:

protected void multiFileUpload_FileUploaded(object sender, FileUploadedEventArgs e)
{
    Session["strHeaderFileName"] = e.File.FileName;
    // etc.
}

protected void btnSave_Click(object sender, EventArgs e)
{
    // here you can access Session["strHeaderFileName"]
}

В зависимости от области действия, в которой значение должно сохраняться, вы также можете установить это на странице, в файле cookie, в базе данных, в кешировании и т. д.

5
задан pango89 13 July 2018 в 14:14
поделиться

7 ответов

Можете ли вы использовать регулярное выражение вместо разделения?

var input = "AB-PQ-EF=CD-IJ=XY-JK";
var pattern = new Regex(@"(?<![A-Z])(?=([A-Z]+[=-][A-Z]+))");
var output = pattern.Matches(input).Cast<Match>().Select(m => m.Groups[1].Value).ToArray();
7
ответ дан Rawling 17 August 2018 в 13:04
поделиться

Не могли бы вы адаптировать что-то вроде этого? Просто нужно изменить факторизацию.

        List<string> lsOut = new List<string>() { };

        string sInput = "AB-PQ-EF=CD-IJ=XY-JK";
        string sTemp = "";


        for (int i = 0; i < sInput.Length; i++)
        {

            if ( (i + 1) % 6 == 0)
            {
                continue;
            }

            // add to temp
            sTemp += sInput[i];

            // multiple of 5, add all the temp to list
            if ( (i + 1 - lsOut.Count) % 5 == 0)
            {
                lsOut.Add(sTemp);
                sTemp = "";
            }

            if(sInput.Length == i + 1)
            {
                lsOut.Add(sTemp);
            }

        }
0
ответ дан atoms 17 August 2018 в 13:04
поделиться

Для решения, использующего string.Split и LINQ, нам просто нужно отслеживать длину каждой части по ходу, чтобы разделитель можно было вытащить из исходной строки, например:

var input = "ABC-PQ-EF=CDED-IJ=XY-JKLM";

var split = input.Split('-', '=');

int offset = 0;

var result = split
            .Take(split.Length - 1)
            .Select((part, index) => {
                offset += part.Length;
                return $"{part}{input[index + offset]}{split[index + 1]}";})
            .ToArray();
0
ответ дан JonMac1374 17 August 2018 в 13:04
поделиться

Вы можете попробовать ниже: здесь мы разделим строку на основе специальных символов. Затем мы будем перебирать элементы и выбирать до следующей группы символов. ex: Получить AB и получить значения до PQ

        string valentry = "AB-PQ-EF=CD-IJ=XY-JK";
        List<string> filt = Regex.Split(valent, @"[\-|\=]").ToList();

        var listEle = new List<string>();
        fil.ForEach(x => 
            {
                if (valentry .IndexOf(x) != valentry .Length - 2)
                {
                    string ele = valentry.Substring(valentry .IndexOf(x), 5);
                    if (!String.IsNullOrEmpty(ele))
                        listEle.Add(ele);
                }
            });

0
ответ дан Lucifer 17 August 2018 в 13:04
поделиться

Недавно изучаем Haskell, так что здесь рекурсивное решение.

static IEnumerable<string> SplitByPair(string input, char[] delimiter)
{
    var sep1 = input.IndexOfAny(delimiter);
    if (sep1 == -1)
    {
        yield break;
    }
    var sep2 = input.IndexOfAny(delimiter, sep1 + 1);
    if (sep2 == -1)
    {
        yield return input;
    }
    else
    {
        yield return input.Substring(0, sep2);
        foreach (var other in SplitByPair(input.Substring(sep1 + 1), delimiter))
        {
            yield return other;
        }
    }
}

Хорошие вещи:

  • Лень
  • Легко распространяться на другие условия и другие типы данных. Тем не менее, это немного сложно в C #, потому что C # не хватает списка List.span и шаблона Haskell.
0
ответ дан qxg 17 August 2018 в 13:04
поделиться

Вот рабочий сценарий. Если у вас есть постоянный фиксированный разделитель, вы будете смотреть только на один вызов Regex.split. В вашей исходной строке нет , но мы можем легко сделать некоторые дублирования в этом входе, чтобы строка стала разделяемой.

string input = "ABC-PQ-EF=CD-IJ=XYZ-JK";
string s = Regex.Replace(input, @"((?<=[=-])[A-Z]+(?=[=-]))", "$1~$1");
Console.WriteLine(s);
var items = Regex.Split(s, @"(?<=[A-Z]{2}[=-][A-Z]{2})[~]");
foreach (var item in items)
{
    Console.WriteLine(item);
}

ABC-PQ~PQ-EF~EF=CD~CD-IJ~IJ=XYZ~XYZ-JK
ABC-PQ
PQ-EF
EF=CD
CD-IJ
IJ=XYZ
XYZ-JK

Демо

Если вы внимательно посмотрите на первую строку вывода выше, вы увидите трюк, который я использовал. Я просто связал пары, которые вы хотите, с помощью другого разделителя (в идеале ~ больше не появляется в вашей строке). Тогда нам просто нужно разделить этот разделитель.

0
ответ дан Tim Biegeleisen 17 August 2018 в 13:04
поделиться
  • 1
    Как сказано в OP, количество символов не фиксировано на 2. – Haytam 13 July 2018 в 11:38
  • 2
    @Haytam Я обобщил свой ответ, чтобы охватить переменное количество символов. – Tim Biegeleisen 13 July 2018 в 11:40
  • 3
    Это не not-have-a-constant-fixed-delimiter , который останавливает один вызов Regex.Split от работы, он должен дублировать буквы. – Rawling 13 July 2018 в 11:41
  • 4
    @Rawling Я не понимаю ваш комментарий или то, что вы пытаетесь сказать здесь. Если у моего ответа есть недостаток, укажите его. – Tim Biegeleisen 13 July 2018 в 11:42
  • 5
    Проверьте его со строкой ABC-PQ-EFZ=CD-IJ=XYZ-JK, последний выход неправильный XYZ-J JK – Haytam 13 July 2018 в 11:42
        string input = "AB-PQ-EF=CD-IJ=XY-JK";
        var result = new Regex(@"(?<![A-Z])(?=([A-Z]+[=-][A-Z]+))").Matches(input)
            .Cast<Match>().Select(m => m.Groups[1].Value).ToArray();
        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
0
ответ дан user3213856 17 August 2018 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: