使用正则表达式循环使用数据表来查找确切的字符串很慢

时间:2015-04-23 06:51:28

标签: c# regex linq datatable

我必须匹配数据表中的确切字符串,并计算每个候选人的投票数。我有一个候选人的投票名单,我使用正则表达式和使用linq的datatble匹配voteId。但是,循环遍历数据行的每一行以找到匹配是非常慢的,因为我必须搜索20次,因为有20个候选者。因此,如果有100行,那么它将循环2000次。

以下是我目前的参考代码

List<string> votingcodes = new List<string> { "M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12", "M13", "M14", "M15", "M16", "M17", "M18", "M19", "M20" };

for (int i = 0; <= votingcodes.Count ; i++)
{
   foreach (DataRow dr in dtFilter.Rows)
   {
     dr["FMSG_IN"] = dr["FMSG_IN"].ToString().ToUpper();
     Regex r = new Regex("^.*\\b" + votingcodes[i] + "\\b.*$");
     DataView dv = (from t in dtFilter.AsEnumerable()
                   where r.IsMatch(t.Field<string>("FMSG_IN") ??"") select t).AsDataView();
   }
}

在循环中我还计算每个候选人的投票并创建一个数据表以将其绑定到网格。

解决方案 - 好吧,由于我的愚蠢,我忘了删除不需要的dtfilter数据表上的foreach循环,因为我在dataview中获得了过滤数据,并且使用该视图我可以进行各种操作。

下面是根据我的问题的工作代码。

List<string> votingcodes = new List<string> { "M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12", "M13", "M14", "M15", "M16", "M17", "M18", "M19", "M20" };

for (int i = 0; < votingcodes.Count ; i++)
{
     Regex r = new Regex("^.*\\b" + votingcodes[i] + "\\b.*$");
     DataView dv = (from t in dtFilter.AsEnumerable()
                   where r.IsMatch(t.Field<string>("FMSG_IN") ??"") select t).AsDataView();

}

3 个答案:

答案 0 :(得分:0)

您的foreach (DataRow dr in dtFilter.Rows)多余,请将其删除。您也可以使用Regex.Escape(votingcodes[i])确保转义特殊字符并使用unambigupus字边界,(?<!\w)(?!\w)。我注意到for循环中有一个拼写错误,已修复。

此外,使用.*来匹配整个字符串没有意义,因为Regex.IsMatch可以找到部分匹配。它还将加速代码执行。

List<string> votingcodes = new List<string> { "M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12", "M13", "M14", "M15", "M16", "M17", "M18", "M19", "M20" };

foreach (var votingcode in votingcodes)
{
     Regex r = new Regex($@"(?<!\w){Regex.Escape(votingcode)}(?!\w)");
     DataView dv = (from t in dtFilter.AsEnumerable()
                   where r.IsMatch(t.Field<string>("FMSG_IN") ??"") select t).AsDataView();

}

答案 1 :(得分:0)

尝试这样的事情

&#13;
&#13;
            List<string> votingcodes = new List<string> { "M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12", "M13", "M14", "M15", "M16", "M17", "M18", "M19", "M20" };
            
            DataTable dt = new DataTable();
            

            List<DataRow> filterRows = dt.AsEnumerable()
                .Where(x =>  votingcodes.Contains(x.Field<string>("FMSG_IN"))).ToList();
​
&#13;
&#13;
&#13;

答案 2 :(得分:0)

有些文本文件只需逐行按顺序读取即可解析。在过去的40年里,我已经解析了非常复杂的文本文件,并且拥有丰富的经验。上次发布的样本数据只是数据的样本行,并没有实际显示数据文件的结构。数据似乎并不准确,因为你有两个&#34;结束M10&#34;和&#34; m1结束&#34;。真实数据非常不一致,字符串的顺序就像那样。如果我有足够的实际样本数据,我可以帮助解决这个问题。