本文整理汇总了C#中IObservable.Cast方法的典型用法代码示例。如果您正苦于以下问题:C# IObservable.Cast方法的具体用法?C# IObservable.Cast怎么用?C# IObservable.Cast使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IObservable
的用法示例。
在下文中一共展示了IObservable.Cast方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: FileTailer
public FileTailer(FileInfo file,
IObservable<FileSearchResult> filter,
IObservable<ScrollRequest> scrollRequest,
ILogger logger,
IScheduler scheduler = null)
{
if (file == null) throw new ArgumentNullException(nameof(file));
if (filter == null) throw new ArgumentNullException(nameof(filter));
if (logger == null) throw new ArgumentNullException(nameof(logger));
logger.Info($"Constructing file tailer for {file.FullName}");
var lines = new SourceList<Line>();
Lines = lines.AsObservableList();
var isBusy = new Subject<bool>();
IsSearching = isBusy.AsObservable();
var locker = new object();
scrollRequest = scrollRequest.Synchronize(locker);
var fileWatcher = file.WatchFile(scheduler: scheduler)
.DistinctUntilChanged()
.TakeWhile(notification => notification.Exists).Repeat()
.Replay(1).RefCount();
var indexer = fileWatcher.Index().Replay(1).RefCount();
//compare latest lines and latest filter and only take the filtered results it is not empty
var latestLines = indexer.Cast<ILineProvider>().Synchronize(locker);
var latestFilter = filter.Cast<ILineProvider>().Synchronize(locker);
var latest = latestLines.CombineLatest(latestFilter, (l, f) => f.IsEmpty ? l : f);
MatchedLines = latest.Select(provider => provider.Count);
TotalLines = latestLines.Select(x => x.Count);
FileSize = fileWatcher.Select(notification => notification.Size);
IsLoading = indexer.Take(1).Select(_ => false).StartWith(true);
var aggregator = latest.CombineLatest(scrollRequest, (currentLines, scroll) =>
{
return currentLines.ReadLines(scroll).ToArray();
})
.Subscribe(currentPage =>
{
var previous = lines.Items.ToArray();
var added = currentPage.Except(previous).ToArray();
var removed = previous.Except(currentPage).ToArray();
lines.Edit(innerList =>
{
if (removed.Any()) innerList.RemoveMany(removed);
if (added.Any()) innerList.AddRange(added);
});
});
//var aggregator = latest.CombineLatest(scrollRequest, (currentLines, scroll) =>
//{
// //TODO: Read entire page, the check which lines should be added and which shold be removed
// //as part of that work, get the maximum inded [this is the head!]
// // Debug.WriteLine($"{scroll.Mode}, {scroll.FirstIndex}, {scroll.PageSize}");
// var currentPage = currentLines.GetIndicies(scroll).ToArray();
// var previous = lines.Items.Select(l => l.LineInfo).ToArray();
// var removed = previous.Except(currentPage, LineInfo.LineIndexComparer).ToArray();
// var added = currentPage.Except(previous, LineInfo.LineIndexComparer).ToArray();
// //calculated added and removed lines
// var removedLines = lines.Items.Where(l => removed.Contains(l.LineInfo)).ToArray();
// Func<long, DateTime?> isTail = l =>
// {
// //account for time with tail (i.e. add time to ILineProvider.TailStartsAt )
// var tail = currentLines.TailStartsAt;
// var onTail = tail != -1 && l >= tail;
// return onTail ? DateTime.Now : (DateTime?)null;
// };
// //Console.WriteLine();
// //finally we can load the line from the file todo: Add encdoing back in
// var newLines = file.ReadLine(added, (lineIndex, text, position) => new Line(lineIndex, text, isTail(position)), Encoding.UTF8).ToArray();
// return new { NewLines = newLines, OldLines = removedLines };
//})
//.Where(fn => fn.NewLines.Length + fn.OldLines.Length > 0)
//.Subscribe(changes =>
//{
// //update observable list
// lines.Edit(innerList =>
//{
// if (changes.OldLines.Any()) innerList.RemoveMany(changes.OldLines);
// if (changes.NewLines.Any()) innerList.AddRange(changes.NewLines);
//});
//});
_cleanUp = new CompositeDisposable(Lines, lines, aggregator, Disposable.Create(() => isBusy.OnCompleted()));
}
示例2: ToCurrencyPair
public static ICurrencyPair ToCurrencyPair(this NSString nsString, IObservable<PriceDto> priceStream)
{
var pair = JsonConvert.DeserializeObject<CurrencyPair>(nsString);
pair.PriceStream = priceStream.Cast<IPrice>();
return pair;
}