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;
        }