C# 检查字符串值是否为单词
我正在开发一个工具来读取Excel文件,该文件包含以下格式的值列表:C# 检查字符串值是否为单词,c#,performance,linq,C#,Performance,Linq,我正在开发一个工具来读取Excel文件,该文件包含以下格式的值列表: ID Description 1 AR2 KSRT FAN W32 2 KSK43 SRTS COOLER S324 3 RT7 MARS 0934X 该工具使用空格作为分隔符拆分每个项目的描述,然后检查英语和德语词典(工具加载时,txt文件加载到字符串列表中)是否为单词。 i、 e: 如果单词上有数字或者长度小于3,我不会检查并假设它不是一个单词 我使用LINQ分割所有描述的值,然后得到不同的
ID Description
1 AR2 KSRT FAN W32
2 KSK43 SRTS COOLER S324
3 RT7 MARS 0934X
该工具使用空格作为分隔符拆分每个项目的描述,然后检查英语和德语词典(工具加载时,txt文件加载到字符串列表中)是否为单词。i、 e: 如果单词上有数字或者长度小于3,我不会检查并假设它不是一个单词 我使用LINQ分割所有描述的值,然后得到不同的值(每个词只搜索一次)
由于您的目标是提高性能,请采取以下步骤:
- 创建一个
post展平数据,并使用正则表达式了解所有值是否都是字符。此外,这将删除对单独的Hashset
的要求,并且通过将Distinct
传递给构造函数,它不区分大小写StringComparer.OrdinalIgnoreCase
var dataHashSet = new HashSet<string>(dtCheck.AsEnumerable() .SelectMany(r => r.Field<string>("columnName") .Split(' ') .Select(x => x) .Where(s => s.Length > 2 && Regex.IsMatch(s, @"^[a-zA-Z]+$"))),StringComparer.OrdinalIgnoreCase)
- 在用于测试的方法
中,确保实现如下:isNeutralLanguage
var result = dataHashSet.AsParallel().Where(x => isNeutralLanguage(x)).ToList();
var dict = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase); private bool isNeutralLanguage(string entry) { bool neutral = true; var isMatch = dict.TryGetValue(entry,out string entryValue); if (isMatch && entryValue != null ) neutral = false; return neutral; }
var dict=新的ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); 私有bool isNeutralLanguage(字符串条目) { 布尔中性=真; var isMatch=dict.TryGetValue(输入,输出字符串entryValue); if(isMatch&&entryValue!=null) 中立=错误; 返回空档; }
- 它不区分大小写,类似于上面的
Hashset
- 它是
,因为调用是ConcurrentDictionary
多线程的
- 中性检查应为O(1)比较,而不是您正在进行的O(N),您可以根据逻辑要求将给定键的值存储为
,并根据键是否存在快速处理布尔值null
- 根据需要更改
逻辑,我做了一些假设isNeutralLanguage
这些更改将确保在您的案例中更快的性能,因为算法得到了改进,处理是并行进行的您可以引入单词的并行处理,并拥有一个不区分大小写的字典来快速处理。您的字典是列表吗?如果你能用类似于Python中的字典的东西(基本上是一个二叉树)来存储字典,它会让你更快地搜索。是的,我的字典是从txt文件加载的字符串列表。谢谢你的提示!您需要的改进是更好地选择数据结构,如
HashSet
,Dictionary
,使用Regex验证字符,使用并行处理获得快速结果,如下面的答案所示
private bool isNeutralLanguage(string entry)
{
bool neutral = true;
var match = dict.FirstOrDefault(stringToCheck => stringToCheck.Contains(entry.ToLower()));
if (match != null && match.Any())
neutral = false;
return neutral;
}
var dataHashSet = new HashSet<string>(dtCheck.AsEnumerable()
.SelectMany(r => r.Field<string>("columnName")
.Split(' ')
.Select(x => x)
.Where(s => s.Length > 2 && Regex.IsMatch(s, @"^[a-zA-Z]+$"))),StringComparer.OrdinalIgnoreCase)
var result = dataHashSet.AsParallel().Where(x => isNeutralLanguage(x)).ToList();
var dict = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
private bool isNeutralLanguage(string entry)
{
bool neutral = true;
var isMatch = dict.TryGetValue(entry,out string entryValue);
if (isMatch && entryValue != null )
neutral = false;
return neutral;
}