Есть несколько вариантов. Поскольку эти методы являются обработчиками событий и не вызываются напрямую, лучший подход здесь, вероятно, приведет к переменным членам уровня класса:
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, в базе данных, в кешировании и т. д.
Можете ли вы использовать регулярное выражение вместо разделения?
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();
Не могли бы вы адаптировать что-то вроде этого? Просто нужно изменить факторизацию.
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);
}
}
Для решения, использующего 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();
Вы можете попробовать ниже: здесь мы разделим строку на основе специальных символов. Затем мы будем перебирать элементы и выбирать до следующей группы символов. 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);
}
});
Недавно изучаем 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;
}
}
}
Хорошие вещи:
Вот рабочий сценарий. Если у вас есть постоянный фиксированный разделитель, вы будете смотреть только на один вызов 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
Если вы внимательно посмотрите на первую строку вывода выше, вы увидите трюк, который я использовал. Я просто связал пары, которые вы хотите, с помощью другого разделителя (в идеале ~
больше не появляется в вашей строке). Тогда нам просто нужно разделить этот разделитель.
Regex.Split
от работы, он должен дублировать буквы.
– Rawling
13 July 2018 в 11:41
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);
}