private SearchDialogRequest GetNextRequest(string text, List <DialogItem> dialogsSource) { SearchDialogRequest nextRequest; if (!_searchResultsCache.TryGetValue(text, out nextRequest)) { foreach (var dialogItem in dialogsSource) { var dialog = dialogItem.Dialog; var chat = dialog.With as TLChatBase; var user = dialog.With as TLUserBase; if (chat != null && chat.FullNameWords == null) { chat.FullNameWords = chat.FullName.Split(' '); } else if (user != null && user.FullNameWords == null) { user.FullNameWords = user.FullName.Split(' '); } } nextRequest = new SearchDialogRequest(text, dialogsSource); } return(nextRequest); }
private void Search(string text) { if (!string.Equals(text, Text, StringComparison.OrdinalIgnoreCase)) { return; } if (_lastRequest != null) { _lastRequest.Cancel(); } var trimmedText = Text.Trim(); if (string.IsNullOrEmpty(trimmedText)) { Execute.BeginOnUIThread(() => { if (!string.Equals(trimmedText, Text.Trim(), StringComparison.OrdinalIgnoreCase)) { return; } Rows.Clear(); var firstSliceCount = 5; var count = 0; var secondSlice = new List <DialogRow>(); foreach (var item in _previousRows) { if (count < firstSliceCount) { Rows.Add(item); count++; } else { secondSlice.Add(item); } } if (secondSlice.Count > 0) { Execute.BeginOnUIThread(() => { if (!string.Equals(trimmedText, Text.Trim(), StringComparison.OrdinalIgnoreCase)) { return; } foreach (var item in secondSlice) { Rows.Add(item); } }); } }); return; } var nextRequest = GetNextRequest(text, DialogsSource); nextRequest.ProcessAsync(results => { if (nextRequest.IsCanceled) { return; } if (!string.Equals(Text, nextRequest.Text, StringComparison.OrdinalIgnoreCase)) { return; } Rows.Clear(); if (results.Count > 0) { DialogRow currentRow = null; var secondSlice = new List <DialogItem>(); var maxCount = 16; for (var i = 0; i < results.Count; i++) { var d = results[i]; if (i < maxCount) { if (i % 4 == 0) { currentRow = new DialogRow(); Rows.Add(currentRow); } currentRow.Add(d); d.Row = currentRow; } else { secondSlice.Add(d); } } if (secondSlice.Count > 0) { Execute.BeginOnUIThread(() => { if (nextRequest.IsCanceled) { return; } if (!string.Equals(Text, nextRequest.Text, StringComparison.OrdinalIgnoreCase)) { return; } for (var i = 0; i < secondSlice.Count; i++) { if (i % 4 == 0) { currentRow = new DialogRow(); Rows.Add(currentRow); } currentRow.Add(secondSlice[i]); secondSlice[i].Row = currentRow; } }); } } }); _searchResultsCache[nextRequest.Text] = nextRequest; _lastRequest = nextRequest; }