Перечисление возможностей, разрешенных грамматикой:
>>> seq[:] # [seq[0], seq[1], ..., seq[-1] ]
>>> seq[low:] # [seq[low], seq[low+1], ..., seq[-1] ]
>>> seq[:high] # [seq[0], seq[1], ..., seq[high-1]]
>>> seq[low:high] # [seq[low], seq[low+1], ..., seq[high-1]]
>>> seq[::stride] # [seq[0], seq[stride], ..., seq[-1] ]
>>> seq[low::stride] # [seq[low], seq[low+stride], ..., seq[-1] ]
>>> seq[:high:stride] # [seq[0], seq[stride], ..., seq[high-1]]
>>> seq[low:high:stride] # [seq[low], seq[low+stride], ..., seq[high-1]]
Конечно, если (high-low)%stride != 0
, то конечная точка будет немного ниже high-1
.
Если stride
отрицательно, порядок изменяется немного, так как мы отсчитываем:
>>> seq[::-stride] # [seq[-1], seq[-1-stride], ..., seq[0] ]
>>> seq[high::-stride] # [seq[high], seq[high-stride], ..., seq[0] ]
>>> seq[:low:-stride] # [seq[-1], seq[-1-stride], ..., seq[low+1]]
>>> seq[high:low:-stride] # [seq[high], seq[high-stride], ..., seq[low+1]]
Расширенные нарезки (с запятыми и эллипсами) в основном используются только специальными структурами данных (например, Numpy) ; основные последовательности не поддерживают их.
>>> class slicee:
... def __getitem__(self, item):
... return `item`
...
>>> slicee()[0, 1:2, ::5, ...]
'(0, slice(1, 2, None), slice(None, None, 5), Ellipsis)'
Вы можете использовать
Dispatcher.Invoke(Delegate, object[])
на диспетчере Application
(или любого UIElement
).
Вы можете использовать его, например, следующим образом:
Application.Current.Dispatcher.Invoke(new Action(() => { /* Your code here */ }));
или
someControl.Dispatcher.Invoke(new Action(() => { /* Your code here */ }));
Лучший способ сделать это - получить SynchronizationContext
из потока пользовательского интерфейса и использовать его. Этот класс абстрагирует марширование вызовов на другие потоки и упрощает тестирование (в отличие от прямого использования WPF Dispatcher
). Например:
class MyViewModel
{
private readonly SynchronizationContext _syncContext;
public MyViewModel()
{
// we assume this ctor is called from the UI thread!
_syncContext = SynchronizationContext.Current;
}
// ...
private void watcher_Changed(object sender, FileSystemEventArgs e)
{
_syncContext.Post(o => DGAddRow(crp.Protocol, ft), null);
}
}
Используйте [Dispatcher.Invoke (DispatcherPriority, Delegate)] для изменения пользовательского интерфейса из другого потока или из фона.
Шаг 1. Используйте следующие пространства имен
using System.Windows;
using System.Threading;
using System.Windows.Threading;
Шаг 2. Поместите следующую строку, где вам нужно обновить UI
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate
{
//Update UI here
}));
Синтаксис
[BrowsableAttribute(false)] public object Invoke( DispatcherPriority priority, Delegate method )
Параметры
priority
Тип:
System.Windows.Threading.DispatcherPriority
Приоритет относительно других ожидающих операций в очереди событий диспетчера вызывает указанный метод.
]
method
Тип:
System.Delegate
Делегат метода, который не принимает аргументов, который помещается в очередь событий диспетчера.
Возврат Значение
Тип:
System.Object
Возвращаемое значение вызываемого делегата или null, если у делегата нет возвращаемого значения.
Информация о версии
Доступно с .NET Framework 3.0
blockquote>