From 089938c1c0434b2dca3abb8ddc672812a6370289 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Thu, 28 Mar 2024 13:16:40 +0800 Subject: [PATCH] code style --- .../Extension/EnumerableExtension.List.cs | 14 +++++++ .../Service/Cultivation/CultivationService.cs | 5 +-- .../Service/Cultivation/MaterialIdComparer.cs | 40 +++++++++++++++++++ .../MetadataServiceContextExtension.cs | 3 +- .../Cultivation/CultivationViewModel.cs | 33 --------------- 5 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Cultivation/MaterialIdComparer.cs 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) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs index 45b30fb9..fa7424cd 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs @@ -181,10 +181,6 @@ internal sealed partial class CultivationViewModel : Abstraction.ViewModel { CultivationMetadataContext context = await metadataService.GetContextAsync().ConfigureAwait(false); statistics = await cultivationService.GetStatisticsCultivateItemCollectionAsync(SelectedProject, context, token).ConfigureAwait(false); - if (statistics is not null) - { - statistics = this.SortStatistics(statistics); - } } catch (OperationCanceledException) { @@ -196,35 +192,6 @@ internal sealed partial class CultivationViewModel : Abstraction.ViewModel } } - private ObservableCollection SortStatistics(ObservableCollection statistics) - { - return statistics.Order(new StatisticsCaltivateItemComparer()).ToObservableCollection(); - } - - private class StatisticsCaltivateItemComparer: IComparer - { - public int Compare(StatisticsCultivateItem? x, StatisticsCultivateItem? y) - { - // TODO: 理论上的最优解:先通过观测枢获取所有背包物品,然后根据filter字段依次分类,先按这个类别做排序,然后再按品质等进行排序 - // 不仅如此,以后想按照材料类型分类的话,这也是必做的。 - - // 对null做判定,防止IDE警告 - if (x is null) { return -1; } - if (y is null) { return -1; } - - // 摩拉、矿、经验书全局只出现一次,放在最前面 - if (x.Inner.Id.Value == 202U) { return -1; } // 摩拉 - if (y.Inner.Id.Value == 202U) { return 1; } - if (x.Inner.Id.Value == 104013U) { return -1; } // 精锻用魔矿 - if (y.Inner.Id.Value == 104013U) { return 1; } - if (x.Inner.Id.Value == 104003U) { return -1; } // 大英雄的经验 - if (y.Inner.Id.Value == 104003U) { return 1; } - - // 剩下的物品暂时按照id排序,更细致的排序策略以后再说 - return (int)x.Inner.Id.Value - (int)y.Inner.Id.Value; - } - } - [Command("NavigateToPageCommand")] private void NavigateToPage(string? typeString) {