Ejemplo n.º 1
0
        private void CalcSimilarity(Account me, Account candidate, ref Span <uint> accounts)
        {
            Similarity similarity = Similarity.Of(me, candidate, accounts, out uint count);

            if (count == 0)
            {
                return;
            }

            if (limit <= _list.Count && similarity < _list[(uint)(_list.Count - 1)].Value)
            {
                return;
            }

            for (int i = 0; i < count; i++)
            {
                var item = new KeyValuePair <uint, Similarity>(accounts[i], similarity);
                if (_list.Count < (limit - 1))
                {
                    _list.Add(item);
                    continue;
                }

                if (_list.Count == limit - 1)
                {
                    _list.Add(item);
                    _list.Sort(this);
                    continue;
                }


                var index = _list.BinarySearch(item, this);
                if (index > 0)
                {
                    continue;
                }

                var listIndex = (uint)(_list.Count - 1);
                var last      = _list[listIndex];
                if (Compare(last, item) > 0)
                {
                    _list.RemoveAt((int)listIndex);
                    var binarySearch = _list.BinarySearch(0, _list.Count, item, this);
                    var insertAt     = ~binarySearch;
                    _list.Insert(insertAt, item);
                }
            }
        }