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