diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/StatisticsCultivateItemCollection.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/StatisticsCultivateItemCollection.cs index 9429fbc..97396fb 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/StatisticsCultivateItemCollection.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/StatisticsCultivateItemCollection.cs @@ -50,7 +50,7 @@ internal sealed partial class StatisticsCultivateItemCollection : ICollection +/// +/// 材料统计默认顺序:与原先一致按 ,但当两项均为「角色培养素材」时先按 再按物品 Id。 +/// +internal sealed class StatisticsCultivateItemComparer : IComparer { private static readonly LazySlim LazyShared = new(() => new()); private StatisticsCultivateItemComparer() - : base(static i => i.Inner.Id, MaterialIdComparer.Shared) { } public static StatisticsCultivateItemComparer Shared { get => LazyShared.Value; } -} \ No newline at end of file + + public int Compare(StatisticsCultivateItem? x, StatisticsCultivateItem? y) + { + return (x, y) switch + { + (null, not null) => -1, + (not null, null) => 1, + (null, null) => 0, + (not null, not null) => CompareCore(x, y), + }; + } + + internal static int CompareCore(StatisticsCultivateItem x, StatisticsCultivateItem y) + { + string? tx = x.Inner.TypeDescription; + string? ty = y.Inner.TypeDescription; + if (IsCharacterLevelUpMaterial(tx) && IsCharacterLevelUpMaterial(ty)) + { + int rank = x.Inner.RankLevel.CompareTo(y.Inner.RankLevel); + if (rank is not 0) + { + return rank; + } + } + + return MaterialIdComparer.Shared.Compare(x.Inner.Id, y.Inner.Id); + } + + private static bool IsCharacterLevelUpMaterial(string? typeDescription) + { + return typeDescription == SH.ModelMetadataMaterialCharacterLevelUpMaterial; + } +}