Массив вида использования объектов OrderBy <>

Это решение убивает дерево процессов в случае оболочки = True, передает параметры процессу (или нет), имеет тайм-аут и получает вывод stdout, stderr и процесс обратного вызова (он использует psutil для kill_proc_tree) , Это было основано на нескольких решениях, размещенных в SO, включая jcollado's. Проводка в ответ на комментарии Ансона и юрида в ответ jcollado. Протестировано в Windows Srvr 2012 и Ubuntu 14.04. Обратите внимание, что для Ubuntu вам необходимо изменить вызов parent.children (...) parent.get_children (...).

def kill_proc_tree(pid, including_parent=True):
  parent = psutil.Process(pid)
  children = parent.children(recursive=True)
  for child in children:
    child.kill()
  psutil.wait_procs(children, timeout=5)
  if including_parent:
    parent.kill()
    parent.wait(5)

def run_with_timeout(cmd, current_dir, cmd_parms, timeout):
  def target():
    process = subprocess.Popen(cmd, cwd=current_dir, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

    # wait for the process to terminate
    if (cmd_parms == ""):
      out, err = process.communicate()
    else:
      out, err = process.communicate(cmd_parms)
    errcode = process.returncode

  thread = Thread(target=target)
  thread.start()

  thread.join(timeout)
  if thread.is_alive():
    me = os.getpid()
    kill_proc_tree(me, including_parent=False)
    thread.join()
20
задан M4N 7 March 2009 в 11:29
поделиться

4 ответа

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

var sorted = array.OrderBy(item => item.Fields["FieldName"].Value);

, С другой стороны, я не понимаю Ваш комментарий, что свойство возвращается как строка, но что можно бросить его к интервалу - Вы не можете бросить строки к ints, необходимо проанализировать их. Если это - то, что Вы имели в виду, Вы, вероятно, хотите:

var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));

, Если Вы хотите это как массив, можно звонить ToArray() впоследствии:

var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value))
                  .ToArray();

, Кроме того, Вы могли использовать Array.Sort, если Вы хотите отсортировать оперативный, но это будет несколько более грязно.

43
ответ дан 29 November 2019 в 22:53
поделиться

Используйте Метод сортировки отсортировать массив:

Array.Sort(theArray, (a, b) => String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value));

, Если Вы не используете C# 3, Вы используете делегата вместо лямбда-выражения:

Array.Sort(theArray, delegate(Item a, Item b) { return String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value); } );

(Это также работает с платформой 2, который не делает расширение OrderBy.)

9
ответ дан 29 November 2019 в 22:53
поделиться

Если можно использовать orderby, это должно быть легко, попробовать следующее. Я добавил международный Синтаксический анализ, хотя в зависимости от того, как Вы на самом деле хотите отсортировать, это не могло бы требоваться.

var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));
5
ответ дан 29 November 2019 в 22:53
поделиться
var sortedArray = items.OrderBy(i => i.property).ToArray();

, Если Вы не хотите массива, можно оставить это, в этом случае, у Вас будет IEnumerable<> объекта типа.

4
ответ дан 29 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

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