diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs index 049bc56e..40d24286 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs @@ -200,6 +200,13 @@ internal static partial class EnumerableExtension return list; } + [MethodImpl(MethodImplOptions.AggressiveOptimization)] + public static List SortBy(this List list, Func keySelector, IComparer comparer) + { + list.Sort((left, right) => comparer.Compare(keySelector(left), keySelector(right))); + return list; + } + [MethodImpl(MethodImplOptions.AggressiveOptimization)] public static List SortByDescending(this List list, Func keySelector) where TKey : IComparable @@ -207,4 +214,11 @@ internal static partial class EnumerableExtension list.Sort((left, right) => keySelector(right).CompareTo(keySelector(left))); return list; } + + [MethodImpl(MethodImplOptions.AggressiveOptimization)] + public static List SortByDescending(this List list, Func keySelector, IComparer comparer) + { + list.Sort((left, right) => comparer.Compare(keySelector(right), keySelector(left))); + return list; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs index d3a93bfc..93cd54e5 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs @@ -126,10 +126,7 @@ internal sealed partial class CultivationService : ICultivationService token.ThrowIfCancellationRequested(); - return resultItems - .OrderByDescending(i => i.TotalCount) - .ThenByDescending(i => i.Count) - .ToObservableCollection(); + return resultItems.SortBy(item => item.Inner.Id, MaterialIdComparer.Shared).ToObservableCollection(); } /// diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/MaterialIdComparer.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/MaterialIdComparer.cs new file mode 100644 index 00000000..236e1d2a --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/MaterialIdComparer.cs @@ -0,0 +1,40 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Primitive; +using Snap.Hutao.ViewModel.Cultivation; + +namespace Snap.Hutao.Service.Cultivation; + +internal sealed class MaterialIdComparer : IComparer +{ + private static readonly Lazy LazyShared = new(() => new()); + + public static MaterialIdComparer Shared { get => LazyShared.Value; } + + public int Compare(MaterialId x, MaterialId y) + { + return Transform(x).CompareTo(Transform(y)); + } + + private static uint Transform(MaterialId value) + { + return value.Value switch + { + // 摩拉 + 202U => 0U, + + // 经验 + 104001U => 1U, + 104002U => 2U, + 104003U => 3U, + + // 魔矿 + 104011U => 4U, + 104012U => 5U, + 104013U => 6U, + + _ => value, + }; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs index f511bc7a..529fda39 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs @@ -5,6 +5,7 @@ using Snap.Hutao.Model.Metadata.Avatar; using Snap.Hutao.Model.Metadata.Item; using Snap.Hutao.Model.Metadata.Weapon; using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Service.Cultivation; namespace Snap.Hutao.Service.Metadata.ContextAbstraction; @@ -67,7 +68,7 @@ internal static class MetadataServiceContextExtension #pragma warning disable SH002 public static IEnumerable EnumerateInventoryMaterial(this IMetadataListMaterialSource context) { - return context.Materials.Where(m => m.IsInventoryItem()).OrderBy(m => m.Id.Value); + return context.Materials.Where(m => m.IsInventoryItem()).OrderBy(m => m.Id, MaterialIdComparer.Shared); } public static Avatar GetAvatar(this IMetadataDictionaryIdAvatarSource context, AvatarId id)