Вы можете сначала отфильтровать myList
в два списка в зависимости от того, имеет ли каждый элемент свойство amount
:
const includesAmount = myList.filter(item => item.hasOwnProperty('amount'));
const excludesAmount = myList.filter(item => !item.hasOwnProperty('amount'));
includesAmount.sort(...)
const finalArray = [...includesAmount, ...excludesAmount];
Это делает два прохода через myList
, но вы можете сделать это за один пройти итерацией по myList
и перенести каждый элемент в соответствующий массив.
Если это работает на сервере, сервис походит на хорошую ставку.
Если Вы хотите что-то немного более интерактивное, у меня есть небольшое приложение, которое живет в моем системном лотке, чтобы показать мне, когда что-то происходит в нашей папке Issues. Это использует Приложение. Выполненный () метод для хранения себя обходящийся без помощи потребности в цикле, т.е.
class MainEntryClass
{
static void Main(string[] args)
{
FolderAlerter fa = new FolderAlerter();
Application.Run();
}
}
Затем я создал свой FileSystemWatcher в FolderAlerter.
В основном FileSystemWatcher использует некоторые встроенные рычаги для подписки на изменения и просто заставляет ОС звонить делегатам, когда изменение происходит. Таким образом, все, что необходимо сделать, мешают основному потоку выйти, он ничего не должен на самом деле делать; К тому времени, когда Вы добираетесь до той строки, основная часть Вашей программы закончена, она сделала то, что она должна была сделать.
Простой способ сделать, что Вы хотите, состоит в том, чтобы внести это изменение в образец из MSDN;
//while (Console.Read() != 'q') ;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
Это поместит Ваш основной поток для сна навсегда, но все еще позволит делегатам запускать и отвечать на изменения в каталоге. Обратите внимание, что это будет продолжать бежать через несколько изменений (точно так же, как образец MSDN).
Обратите внимание, что, "в то время как" в MSDN образец действительно не делает многого; Вы могли заменить ту строку просто "Консолью. Читайте ()", который затем заставил бы любой ключ выйти из приложения. Это - просто строка, чтобы мешать основному потоку выйти так, чтобы это было все еще вокруг, когда уведомления о событии входят.
Однако с помощью Сна (Тайм-аут. Бог), оставляет Ваше приложение в состоянии, где оно не может быть легко остановлено пользователем, кроме путем уничтожения приложения. Если Вы пишете это, поскольку консольное приложение, почему бы не придерживаться с "нажимают Q для выхода"? Если Вы решите записать это как услуга вместо этого, то это, вероятно, будет в порядке, пока Вы обрабатываете события завершения работы/перезапуска и т.д.
Чтобы сделать это, Вы, вероятно, хотите создать a ManualResetEvent
в состоянии сброса и имеют Ваш основной поток WaitOne()
на нем. Для завершения некоторый другой обратный вызов может просто Set()
событие, которое вызовет WaitOne()
возвратиться.
Sysinternals (теперь принадлежавший Microsoft) имеет FileMon, который даст Вам, в чем Вы нуждаетесь с источником.
Заключение в кавычки от сайта
основа FileMon находится в драйвере виртуального устройства, Filevxd.vxd. Это динамично загружается, и в его инициализации это устанавливает фильтр файловой системы через услуги VxD, IFSMGR_InstallFileSystemApiHook, для вставки себя на цепочку вызовов всех запросов к файловой системе.
Двоичные файлы и источники могут быть найдены здесь: http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx
Вы могли использовать Поток. Сон для предотвращения пустого цикла. Однако в случае, например, системная перезагрузка служба Windows будет перезапущена автоматически. Другой подход, в зависимости от того, как остальная часть программы/системы проектируется, должен использовать Windows Scheduler для выполнения логики опроса в отдельном .exe файле.
При поиске устойчивого/эластичного решения или служба Windows или подход Windows Scheduler-based кажутся предпочтительными.