Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查字符串值是否为单词_C#_Performance_Linq - Fatal编程技术网

C# 检查字符串值是否为单词

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分割所有描述的值,然后得到不同的

我正在开发一个工具来读取Excel文件,该文件包含以下格式的值列表:

ID    Description
1     AR2 KSRT FAN W32
2     KSK43 SRTS COOLER S324
3     RT7 MARS 0934X
该工具使用空格作为分隔符拆分每个项目的描述,然后检查英语和德语词典(工具加载时,txt文件加载到字符串列表中)是否为单词。
i、 e:

如果单词上有数字或者长度小于3,我不会检查并假设它不是一个单词

我使用LINQ分割所有描述的值,然后得到不同的值(每个词只搜索一次)


由于您的目标是提高性能,请采取以下步骤:

  • 创建一个
    Hashset
    post展平数据,并使用正则表达式了解所有值是否都是字符。此外,这将删除对单独的
    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;
}