diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs index f0c58d27..0cf7b994 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs @@ -67,20 +67,56 @@ public class ProfilesSelectViewModel(Func>? upd public Task SortServer(string colName) { - _ = colName; - //if (colName.IsNullOrEmpty()) - //{ - // return; - //} + if (colName.IsNullOrEmpty()) + { + return Task.CompletedTask; + } + + var prop = typeof(ProfileItemModel).GetProperty(colName); + if (prop == null) + { + return Task.CompletedTask; + } + + _dicHeaderSort.TryAdd(colName, true); + var asc = _dicHeaderSort[colName]; + + var comparer = Comparer.Create((a, b) => + { + if (ReferenceEquals(a, b)) + { + return 0; + } + if (a is null) + { + return -1; + } + if (b is null) + { + return 1; + } + if (a.GetType() == b.GetType() && a is IComparable ca) + { + return ca.CompareTo(b); + } + return string.Compare(a.ToString(), b.ToString(), StringComparison.OrdinalIgnoreCase); + }); + + object? KeySelector(ProfileItemModel x) + { + return prop.GetValue(x); + } + + IEnumerable sorted = asc + ? ProfileItems.OrderBy(KeySelector, comparer) + : ProfileItems.OrderByDescending(KeySelector, comparer); + + var list = sorted.ToList(); + ProfileItems.Clear(); + ProfileItems.AddRange(list); + + _dicHeaderSort[colName] = !asc; - //_dicHeaderSort.TryAdd(colName, true); - //_dicHeaderSort.TryGetValue(colName, out bool asc); - //if (await ConfigHandler.SortServers(_config, _config.SubIndexId, colName, asc) != 0) - //{ - // return; - //} - //_dicHeaderSort[colName] = !asc; - //await RefreshServers(); return Task.CompletedTask; }