У меня есть функция в DLL, которую я создал, которая выполняет команды SQL и возвращает файл пути из того места, где они были выполнены, количество команд с ошибками и количеством команд, выполненных успешно всего в 3 позиции. массив. Проблема заключается в том, что он возвращается только в том случае, когда заканчивается конец foreach, который позволит мне представить только текстовое поле в форме последнего исполняемого файла, и мне нужно показать путь к файлу, когда они будут выполнены.Как вернуть значение из функции, но сохранить функцию «живой» C#
Мне нужен способ, чтобы вернуть массив Каждый раз, когда Foreach итерацию, но сохраняющий> функцию живых, так что выполняет все остальные команды в следующих> файлах, это функция:
public string[] ExecuteCommands(string Directoria, CdpsiUpdateSql Updater, CdpsiUpdateSqlparser parser, string Log)
{
string[] numArray1 = new string[3];
List<string> list = ((IEnumerable<string>)Directory.GetFiles(Directoria, "*.sql", SearchOption.TopDirectoryOnly)).Select(f =>
{
string[] strArray = Path.GetFileName(f).Split('_');
int result;
if (strArray.Length < 1 || !int.TryParse(strArray[0], out result))
result = -1;
var data = new
{
File = f,
Version = result
};
return data;
}).Where(f => f.Version > -1).OrderBy(f => f.Version).Select(f => f.File).ToList<string>();
foreach (string str in list)
{
int[] numArray2 = this.ExecuteCommand(parser.Parser(str), Updater, str, Log);
int Certos = Convert.ToInt32(numArray1[0]);
int Errados = Convert.ToInt32(numArray1[1]);
Certos += numArray2[0];
Errados += numArray2[1];
numArray1[0] = Certos.ToString();
numArray1[1] = Errados.ToString();
numArray1[2] = str;
}
return numArray1;
}
Любая помощь будет высокоочищенного aprecciated, спасибо
используя выход?
public IEnumerable<string []> ExecuteCommands(string Directoria, CdpsiUpdateSql Updater, CdpsiUpdateSqlparser parser, string Log)
{
string[] numArray1 = new string[3];
List<string> list = ((IEnumerable<string>)Directory.GetFiles(Directoria, "*.sql", SearchOption.TopDirectoryOnly)).Select(f =>
{
string[] strArray = Path.GetFileName(f).Split('_');
int result;
if (strArray.Length < 1 || !int.TryParse(strArray[0], out result))
result = -1;
var data = new
{
File = f,
Version = result
};
return data;
}).Where(f => f.Version > -1).OrderBy(f => f.Version).Select(f => f.File).ToList<string>();
foreach (string str in list)
{
int[] numArray2 = this.ExecuteCommand(parser.Parser(str), Updater, str, Log);
int Certos = Convert.ToInt32(numArray1[0]);
int Errados = Convert.ToInt32(numArray1[1]);
Certos += numArray2[0];
Errados += numArray2[1];
numArray1[0] = Certos.ToString();
numArray1[1] = Errados.ToString();
numArray1[2] = str;
yield return numArray1;
}
//return numArray1;
}
Прежде всего сделать класс для хранения результата (класс 'CommandResult {общественные ИНТ Certos; общественности int Errados, public string Command;} '), а затем вернуть' IEnumerable ', а затем опубликовать его в Code Review, есть некоторые интересные вещи, которые вы можете сделать, чтобы сделать этот код более удобным для чтения. –
@AdrianoRepetti можете ли вы добавить пример? Если я вернусь, IEnumerable не закончит функцию, когда достигнет возврата? – LikeIfYouCaredAboutMyName
Да, но вы сохраняете результаты в 'List' или используете синтаксис 'yield return'. –