【问题标题】:C# - Match If Value in a Dictionary<string,string> match with specified stringC# - 如果 Dictionary<string,string> 中的值与指定字符串匹配,则匹配
【发布时间】:2011-07-12 23:45:07
【问题描述】:

基本上,我的 SQL 表中有一些产品已经分组到某些类别中。例如笔记本电脑、相机、MP3 播放器等。现在,当我采用这些类别之一的产品(例如笔记本电脑)时,我需要根据它们的功能/选项进一步深入研究它们。 (例如 - RAM 大小(1 GB、4 GB、..)、处理器类型(Core i7、Core i3..)、硬盘大小(250 GB、500 GB)等)。最初,我使用 MSSQL 的Contains('COLUMNNAME', 'FormsOf(Inflectional, SOMEWORD)) 进行了分类。这种方法有效,但完成我数据库中的所有记录需要将近 8 小时。 (30 万条记录)

所以现在我正在考虑基于正则表达式的实现。所以这是我到目前为止想出的。这段代码可能很清楚。

 private static void Main(string[] args)
        {
            var productList = new Dictionary<string, string>
                                  {
                                      {"10101", "Samsung NF210 Netbook - 10.1ins - 1GB RAM - 250GB Hard Drive"},
                                      {"10102", "Samsung NP-NF210 Netbook, Intel Atom 1.5GHz, 1GB RAM, 250GB with 10.1 Inch Display, Silver"},
                                      {"10103", "Sony Vaio VPC-F13Z0E/B Laptop, Intel Core i7, 1.73GHz, 6GB RAM, 640GB with 16.4 Inch Display, Black"}
                                  };

            var featureList = new Dictionary<int, string>
                                  {
                                      {1, "1 GB"}, // RAM SIZE
                                      {2, "2 GB"}, // RAM SIZE
                                      {3, "250GB"}, // HARD DRIVE SIZE
                                      {4, "640GB"}, // HARD DRIVE SIZE
                                      {5,"Core i7"}, // Porcessor Type
                                      {6,"Core i3"}, // Porcessor Type
                                      {7,"Netbook"}, // Type
                                      {8,"Laptop"} // Type
                                  };

            foreach (var feature in featureList)
            {
                var keyword1 = feature;

                var results = from result in productList
                              where Regex.IsMatch(result.Value, keyword1.Value, RegexOptions.Singleline)
                              select result;

                foreach (var result in results)
                {
                    Console.WriteLine(feature.Key + " - " + feature.Value);
                    Console.WriteLine(result.Key + " - " + result.Value);
                    Console.WriteLine("");
                }  
            }


            Console.ReadKey();
        }

所以我现在真正的问题是,这种方法是否有效?我知道我所做的方式不如SQL Contains,但它似乎有效。还有其他建议吗?

【问题讨论】:

  • 注意:字典是建立在基于唯一键的快速查找的思想之上的。当您的逻辑转而关注价值时,您可能使用了错误的工具或错误的方法。
  • 如果您的问题是:Regex 是文本搜索的最佳方法,那么我会说是的。
  • 你有没有试过执行var results = ...这行我相信你会得到一个异常。而且您将不断更新/维护该正则表达式。
  • 我之所以使用Dictionary,是想在匹配记录后将SQLProductIdfeatureId(SQL Products,Feature表)存储到另一个映射表(ProductFeatures)中。跨度>
  • @IAbstract - 嗯,实际上没有例外。

标签: c# regex


【解决方案1】:

为此使用正则表达式实在是太过分了,而且存在安全漏洞。

使用String.Contains

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-24
    • 2015-07-14
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多