From 68a6834d39329d47c417242ca8c30e4709fb9d75 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Wed, 20 Sep 2023 11:28:34 +0800 Subject: [PATCH] fix #930 --- .../Extension/EnumerableExtension.List.cs | 30 +++++++++++++++++++ .../Resource/Localization/SH.Designer.cs | 8 ++--- .../Snap.Hutao/Resource/Localization/SH.resx | 8 ++--- .../Factory/GachaStatisticsFactory.cs | 4 +-- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs index 338da0dc..669b02a2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs @@ -30,6 +30,36 @@ internal static partial class EnumerableExtension return (double)sum / span.Length; } + public static T? BinarySearch(this List list, Func comparer) + where T : class + { + list.BinarySearch + Span span = CollectionsMarshal.AsSpan(list); + int left = 0; + int right = span.Length - 1; + + while (left <= right) + { + int middle = (left + right) / 2; + ref T current = ref span[middle]; + int compareResult = comparer(current); + if (compareResult == 0) + { + return current; + } + else if (compareResult < 0) + { + right = middle - 1; + } + else + { + left = middle + 1; + } + } + + return default; + } + /// /// 如果传入列表不为空则原路返回, /// 如果传入列表为空返回一个空的列表 diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index 284fdf01..aec7dd36 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -1987,7 +1987,7 @@ namespace Snap.Hutao.Resource.Localization { } /// - /// 查找类似 找不到游戏配置文件 {0} 的本地化字符串。 + /// 查找类似 无法读取游戏配置文件 {0},可能是文件不存在 的本地化字符串。 /// internal static string ServiceGameSetMultiChannelConfigFileNotFound { get { @@ -2005,7 +2005,7 @@ namespace Snap.Hutao.Resource.Localization { } /// - /// 查找类似 在查找必要的模块时遇到问题:无法读取任何模块,可能是保护驱动已经加载完成 的本地化字符串。 + /// 查找类似 在查找必要的模块时遇到问题:无法读取任何模块,可能是保护驱动已经加载完成,请重试 的本地化字符串。 /// internal static string ServiceGameUnlockerFindModuleNoModuleFound { get { @@ -2014,7 +2014,7 @@ namespace Snap.Hutao.Resource.Localization { } /// - /// 查找类似 在查找必要的模块时遇到问题:查找模块超时 的本地化字符串。 + /// 查找类似 在查找必要的模块时遇到问题:查找模块超时,请重试 的本地化字符串。 /// internal static string ServiceGameUnlockerFindModuleTimeLimitExeeded { get { @@ -3661,7 +3661,7 @@ namespace Snap.Hutao.Resource.Localization { } /// - /// 查找类似 无法读取游戏配置文件: {0} 的本地化字符串。 + /// 查找类似 无法读取游戏配置文件: {0},可能是文件不存在或权限不足 的本地化字符串。 /// internal static string ViewModelLaunchGameMultiChannelReadFail { get { diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index f8e75925..80cbf8ee 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -816,16 +816,16 @@ 找不到 PowerShell 的安装目录 - 找不到游戏配置文件 {0} + 无法读取游戏配置文件 {0},可能是文件不存在 无法读取或保存配置文件,请以管理员模式重试 - 在查找必要的模块时遇到问题:无法读取任何模块,可能是保护驱动已经加载完成 + 在查找必要的模块时遇到问题:无法读取任何模块,可能是保护驱动已经加载完成,请重试 - 在查找必要的模块时遇到问题:查找模块超时 + 在查找必要的模块时遇到问题:查找模块超时,请重试 在匹配内存时遇到问题:无法匹配到期望的内容 @@ -1374,7 +1374,7 @@ 切换服务器失败 - 无法读取游戏配置文件: {0} + 无法读取游戏配置文件: {0},可能是文件不存在或权限不足 游戏路径不正确,前往设置更改游戏路径 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs index 2c98df79..4100b4b0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs @@ -69,9 +69,9 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory // 'ref' is not allowed here because we have lambda below foreach (Model.Entity.GachaItem item in CollectionsMarshal.AsSpan(items)) { - // Find target history wish to operate. + // Find target history wish to operate. // w.From <= item.Time <= w.To HistoryWishBuilder? targetHistoryWishBuilder = item.GachaType is not (GachaConfigType.StandardWish or GachaConfigType.NoviceWish) - ? historyWishBuilderMap[item.GachaType].FirstOrDefault(w => w.From <= item.Time && w.To >= item.Time) + ? historyWishBuilderMap[item.GachaType].BinarySearch(w => item.Time < w.From ? -1 : item.Time > w.To ? 1 : 0) : default; switch (item.ItemId.StringLength())