public void UpdatePsoNeighborhood(NetworkNodeInfo[] allNetworkNodes, NetworkNodeInfo currentNetworkNode) { //do nothing if there is only current network in collection if (allNetworkNodes == null || allNetworkNodes.Length <= 1) return; var nodes = allNetworkNodes.OrderBy(t => t.Id).ToArray(); NetworkNodeInfo previous = null, next = null; for (int index = 0; index < nodes.Length; index++) { var node = nodes[index]; if (node.Id != currentNetworkNode.Id) continue; previous = nodes[(index - 1 + nodes.Length) % nodes.Length]; next = nodes[(index + 1) % nodes.Length]; break; } if (previous == null || next == null) { throw new ArgumentException("allNetworkNodes should include this node itself"); } if (_left.Item1 == null || previous.Id != _left.Item1.Id || !previous.ProxyParticlesAddresses.Contains(_left.Item2.RemoteAddress)) { _left.Item2.UpdateRemoteAddress(previous.ProxyParticlesAddresses[0]); _left = new Tuple<NetworkNodeInfo, ProxyManager>(previous, _left.Item2); } if (_right.Item1 == null || next.Id != _right.Item1.Id || !next.ProxyParticlesAddresses.Contains(_right.Item2.RemoteAddress)) { _right.Item2.UpdateRemoteAddress(next.ProxyParticlesAddresses[next.ProxyParticlesAddresses.Length - 1]); _right = new Tuple<NetworkNodeInfo, ProxyManager>(next, _right.Item2); } }