47 lines
1.6 KiB
C#
47 lines
1.6 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
|
||
namespace BoreholeExtract
|
||
{
|
||
public class KeywordMatcher
|
||
{
|
||
// 缓存字典:Key是枚举,Value是用户配置的关键词列表
|
||
private readonly Dictionary<Identify, List<string>> _keywordMap;
|
||
|
||
// 构造函数:传入 ViewModel 中的数据
|
||
public KeywordMatcher(IEnumerable<CategoryWrapper> dashboardItems)
|
||
{
|
||
_keywordMap = new Dictionary<Identify, List<string>>();
|
||
|
||
foreach (var item in dashboardItems)
|
||
{
|
||
// 过滤掉空字符串,防止 txt.Contains("") 永远为 true
|
||
var validKeywords = item.Items
|
||
.Where(k => !string.IsNullOrWhiteSpace(k))
|
||
.ToList();
|
||
|
||
if (validKeywords.Count > 0)
|
||
{
|
||
_keywordMap[item.Id] = validKeywords;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断文本是否包含该 ID 下的任意一个关键词
|
||
/// </summary>
|
||
public bool IsMatch(Identify id, string text)
|
||
{
|
||
if (string.IsNullOrEmpty(text)) return false;
|
||
|
||
// 如果配置里没有这个 ID,直接返回 false
|
||
if (!_keywordMap.TryGetValue(id, out var keywords)) return false;
|
||
|
||
// 核心逻辑:只要包含任意一个关键词,就返回 true
|
||
// StringComparison.OrdinalIgnoreCase 可以忽略大小写(可选)
|
||
return keywords.Any(k => text.Contains(k, StringComparison.OrdinalIgnoreCase));
|
||
}
|
||
}
|
||
}
|