public static ParticleInfo FindParticle(string name) { name = ParticleInfo.UnifiedName(name); // use binary search; if there are equal names - return first particle var particles = Instance.particles; int min = 0; int max = particles.Count; int center = 0; while (max != min) { center = (min + max) / 2; var comparison = string.CompareOrdinal(name, particles[center].name); if (comparison < 0) { max = center; continue; } if (comparison > 0) { min = center + 1; continue; } break; } if (min == max) { return(null); } // exact match was found int start = center - 1; while (start >= min && string.CompareOrdinal(name, particles[start].name) == 0) { start--; } return(particles[start + 1]); // we return first particle with this name }