mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-23 03:04:29 +08:00
- 将 AbstractLogger 实现从 ILogger 扩展为 IStructuredLogger 接口 - 添加通用日志方法 Log(LogLevel, string, params object[]) 支持格式化参数 - 实现结构化日志方法支持属性键值对记录 - 添加 ConsoleAppender、FileAppender 和 AsyncLogAppender 日志输出器 - 实现 CompositeFilter 过滤器和 DefaultLogFormatter、JsonLogFormatter 格式化器 - 在 ConsoleLogger 和 GodotLogger 中使用预缓存的日志级别字符串提升性能 - 使用 ANSI 颜色代码替代 ConsoleColor 实现跨平台日志着色 - 在 ConsoleLoggerFactoryProvider 和 GodotLoggerFactoryProvider 中添加日志工厂缓存 - 优化 FileStorage 中目录遍历使用 OfType<string>() 类型转换 - 添加 LogContext 支持异步流中的结构化属性传递
53 lines
1.7 KiB
C#
53 lines
1.7 KiB
C#
namespace GFramework.Core.extensions;
|
||
|
||
/// <summary>
|
||
/// Span 和 ReadOnlySpan 扩展方法,提供零分配的高性能操作
|
||
/// </summary>
|
||
public static class SpanExtensions
|
||
{
|
||
/// <summary>
|
||
/// 尝试将字符 span 解析为指定类型
|
||
/// </summary>
|
||
/// <typeparam name="T">目标类型,必须实现 ISpanParsable 接口</typeparam>
|
||
/// <param name="span">要解析的字符 span</param>
|
||
/// <param name="result">解析结果,失败时为 default(T)</param>
|
||
/// <returns>如果解析成功返回 true,否则返回 false</returns>
|
||
/// <example>
|
||
/// <code>
|
||
/// ReadOnlySpan<char> span = "123";
|
||
/// if (span.TryParseValue<int>(out var result))
|
||
/// {
|
||
/// Console.WriteLine(result); // 123
|
||
/// }
|
||
/// </code>
|
||
/// </example>
|
||
public static bool TryParseValue<T>(this ReadOnlySpan<char> span, out T? result) where T : ISpanParsable<T>
|
||
{
|
||
return T.TryParse(span, null, out result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算 span 中指定值出现的次数
|
||
/// </summary>
|
||
/// <typeparam name="T">元素类型,必须实现 IEquatable 接口</typeparam>
|
||
/// <param name="span">要搜索的 span</param>
|
||
/// <param name="value">要计数的值</param>
|
||
/// <returns>值出现的次数</returns>
|
||
/// <example>
|
||
/// <code>
|
||
/// ReadOnlySpan<int> span = stackalloc int[] { 1, 2, 3, 2, 1 };
|
||
/// var count = span.CountOccurrences(2); // 2
|
||
/// </code>
|
||
/// </example>
|
||
public static int CountOccurrences<T>(this ReadOnlySpan<T> span, T value) where T : IEquatable<T>
|
||
{
|
||
var count = 0;
|
||
foreach (var item in span)
|
||
{
|
||
if (item.Equals(value))
|
||
count++;
|
||
}
|
||
|
||
return count;
|
||
}
|
||
} |