GeWuYou eec50ab45b feat(events): 添加事件上下文支持和线程安全改进
- 在EventBus中添加RegisterWithContext方法支持事件上下文
- 实现EventContext<T>类包装事件数据并提供处理控制
- 在PriorityEvent中添加上下文事件处理器和相关管理逻辑
- 改进事件触发机制支持普通和上下文处理器混合使用
- 优化MicrosoftDiContainer的线程安全性和并发访问
- 修复SpanExtensions中TryParseValue的返回值类型问题
- 添加全面的单元测试覆盖新功能和边界情况
2026-02-25 21:39:53 +08:00

53 lines
1.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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&lt;char&gt; span = "123";
/// if (span.TryParseValue&lt;int&gt;(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&lt;int&gt; 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;
}
}