protected List<List<T>> AllCombos<T>(Func<List<T>, List<T>, bool> comparer, params T[] items)
{
List<List<T>> results = new List<List<T>>();
List<T> workingWith = items.ToList();
results.Add(workingWith);
items.ToList().ForEach((x) =>
{
results.Add(new List<T>() { x });
});
for (int i = 0; i < workingWith.Count(); i++)
{
T removed = workingWith[i];
workingWith.RemoveAt(i);
List<List<T>> nextResults = AllCombos2(comparer, workingWith.ToArray());
results.AddRange(nextResults);
workingWith.Insert(i, removed);
}
results = results.Where(x => x.Count > 0).ToList();
for (int i = 0; i < results.Count; i++)
{
List<T> list = results[i];
if (results.Where(x => comparer(x, list)).Count() > 1)
{
results.RemoveAt(i);
}
}
return results;
}
protected List<List<T>> AllCombos2<T>(Func<List<T>, List<T>, bool> comparer, params T[] items)
{
List<List<T>> results = new List<List<T>>();
List<T> workingWith = items.ToList();
if (workingWith.Count > 1)
{
results.Add(workingWith);
}
for (int i = 0; i < workingWith.Count(); i++)
{
T removed = workingWith[i];
workingWith.RemoveAt(i);
List<List<T>> nextResults = AllCombos2(comparer, workingWith.ToArray());
results.AddRange(nextResults);
workingWith.Insert(i, removed);
}
results = results.Where(x => x.Count > 0).ToList();
for (int i = 0; i < results.Count; i++)
{
List<T> list = results[i];
if (results.Where(x => comparer(x, list)).Count() > 1)
{
results.RemoveAt(i);
}
}
return results;
}
Это сработало для меня, оно немного сложнее и фактически выполняет функцию обратного вызова сравнения, и на самом деле это две функции, разница заключается в том, что AllCombos явно добавляет отдельные списки элементов. Он очень сырой и определенно может быть обрезан, но он выполняет свою работу. Любые предложения по рефакторингу приветствуются. Спасибо,
Возможно перенаправить стандартный ввод/вывод приложений консоли/DOS с помощью класса Процесса. Это могло бы выглядеть примерно так:
var processStartInfo = new ProcessStartInfo("someoldapp.exe", "-p someparameters");
processStartInfo.UseShellExecute = false;
processStartInfo.ErrorDialog = false;
processStartInfo.RedirectStandardError = true;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = processStartInfo;
bool processStarted = process.Start();
StreamWriter inputWriter = process.StandardInput;
StreamReader outputReader = process.StandardOutput;
StreamReader errorReader = process.StandardError;
process.WaitForExit();
можно теперь использовать потоки для взаимодействия с приложением. Путем установки processStartInfo. CreateNoWindow к истинному исходное приложение будет скрыт.
я надеюсь, что это помогает.
Относительно Вашего вопроса о том, как отобразить приложение для DOS в Приложении Windows.
существует несколько решений.
первый не должен просто отобразить приложение для DOS (с CreateNoWindow) и "моделировать" UI приложения для DOS в Вашем Приложении Windows путем чтения и записи в потоки.
другое решение состояло бы в том, чтобы использовать Win32API, получить Windows Handle (Whnd) окна приложения Консоли/DOS и установить его родителя на Вашу форму. Я в настоящее время не дома и так как это были возрасты, так как я сделал это, я не могу помнить наизусть, как это сделано. Если я не ошибусь, то необходимо будет использовать следующие вызовы API Win32:
, Если я уезжаю некоторое время спустя сегодня, я буду видеть, могу ли я найти лучшие образцы.
Можно использовать функцию CreateProcess и hStdInput, Вывод и Ошибочных членов аргумента STARTUPINFO, это позволит Вам прерывать стандартный ввод и вывод приложения.