public IList <DHTNode> FindNodes(byte[] id) { DHTNode[] values; lock (fLock) { values = fKTable.Values.ToArray(); } if (values.Length <= 8) { return(values); } var list = new SortedList <byte[], DHTNode>(8, RouteComparer.Instance); var minTime = DateTime.MaxValue.Ticks; var tableFull = fKTable.Count >= fMaxNodeSize; foreach (var item in values) { if (tableFull && DateTime.Now.Ticks - item.LastUpdateTime > fRouteLife.Ticks) { fKTable.Remove(item.RouteId); continue; } var distance = DHTHelper.ComputeRouteDistance(item.ID, id); if (list.Count >= 8) { if (RouteComparer.Instance.Compare(list.Keys[0], distance) >= 0) { continue; } list.RemoveAt(0); } list.Add(distance, item); minTime = Math.Min(fMinLastTime, item.LastUpdateTime); } fMinLastTime = Math.Max(minTime, fMinLastTime); return(list.Values); }