private SortType _sortType; public void Sort(SortType sortType) { _sortType = sortType; List list = new List((IEnumerable)Controls); list.Sort(new Comparison(Comparer)); Controls.Clear(); for (int i = 0; i < list.Count; i++) MainForm.Instance.AddControl(list[i], true); } public int Comparer(CEntryPanel one, CEntryPanel two) { switch (_sortType) { default: { char[] oneChars = GetChars(one); char[] twoChars = GetChars(two); int length = Math.Min(oneChars.Length, twoChars.Length); for (int i = 0; i < length; i++) if (oneChars[i].Equals(twoChars[i])) continue; else return oneChars[i].CompareTo(twoChars[i]); return 0; } case SortType.Average: case SortType.Online: case SortType.Ping: case SortType.Peak: { int oneValue = GetInts(one); int twoValue = GetInts(two); if (_sortType == SortType.Ping) if (oneValue == 0 || twoValue == 0) return -1; return oneValue.CompareTo(twoValue); } } } private int GetInts(CEntryPanel one) { switch (_sortType) { case SortType.Average: return one.ShardEntry.PlayerInfo.Average; case SortType.Online: return one.ShardEntry.PlayerInfo.Online; case SortType.Ping: return (int)one.ShardEntry.ShardNetworkInfo.PingTime; default: return one.ShardEntry.PlayerInfo.Peak; } } private char[] GetChars(CEntryPanel one) { switch (_sortType) { case SortType.Name: return one.ShardEntry.ShardInfo.Name.ToCharArray(); case SortType.Era: return Enum.GetName(typeof(Era), one.ShardEntry.ShardInfo.Era).ToCharArray(); case SortType.Language: return Enum.GetName(typeof(Language), one.ShardEntry.ShardInfo.Language).ToCharArray(); case SortType.Ping: return one.ShardEntry.ShardNetworkInfo.PingTime.ToString().ToCharArray(); default: return Enum.GetName(typeof(PlayType), one.ShardEntry.ShardInfo.PlayType).ToCharArray(); } } public CEntryPanel PanelConversion(Control c) { return (CEntryPanel)c; }