【问题标题】:Get matching and non matching records using Regex and LINQ使用 Regex 和 LINQ 获取匹配和不匹配的记录
【发布时间】:2015-10-20 08:28:54
【问题描述】:

我有一个包含 20 个项目的字符串列表,如下所示

List<string> votingcodes = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"};

我正在使用正则表达式模式从另一个数据表中获取数据视图中的匹配数据,如下所示

for (int i = 0; i < 20; i++)
{
     var r = new Regex("^.*\\b" + votingcodes[i] + "\\b.*$", RegexOptions.Compiled);

     DataView dv = (from t in dtFetch.AsEnumerable()
                    where r.IsMatch(t.Field<string>("FMSG_IN").ToUpper())
                    select t).AsDataView();
}

获取数据后,我更新了记录,但我还需要来自 dtFetch 数据表的不匹配数据。

我怎样才能做到这一点。

【问题讨论】:

  • where !r.IsMatch(t.Field&lt;string&gt;("FMSG_IN").ToUpper()) ?
  • 我知道!是适用的,但这会产生两个循环,一个用于匹配,另一个用于不匹配。此外,它会在第一个循环中为我提供 2-20 的不匹配数据,这是不正确的。
  • 您应该在问题中提及这一点。但是,您真的需要DataView 作为结果吗?因为您无法添加另一列来指示它是否是匹配行。
  • 我正在使用 dataview 来获取匹配数据的计数,其中还包含用于根据 ID 更新记录的列。如果您建议,那么我们可以使用 dtFetch DataTable 逐个更新记录,如果匹配返回 true,否则返回 false,我会相应地进行更新。

标签: c# regex linq


【解决方案1】:

如果您想在一个查询中同时获得两个结果,您可以使用GroupByToLookup。我认为你根本不需要循环:

List<string> votingcodes = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"};
var matchRegexes = votingcodes
    .Select(c => new Regex("^.*\\b" + c + "\\b.*$", RegexOptions.Compiled));
var matchLookup = dtFetch.AsEnumerable()
    .ToLookup(row => matchRegexes
        .Any(r => r.IsMatch(row.Field<string>("FMSG_IN").ToUpper())));
var matchRows = matchLookup[true];
var noMatchRows = matchLookup[false];
DataView dvMatch = null;
DataView dvNoMatch = null;
if (matchRows.Any())
    dvMatch = matchRows.CopyToDataTable().DefaultView;
if (noMatchRows.Any())
    dvNoMatch = noMatchRows.CopyToDataTable().DefaultView;

【讨论】:

  • 当 i =1 的值时,这将再次在第一个循环上给我不正确的数据,然后 dvMatch 将返回字符串中所有带 1 的记录,但 dvNoMatch 将返回循环 2-20 中的剩余数据不正确,即技术上正确。
  • 再告诉我一件事,目前我正在以正则表达式模式从列表中取出 1 项,然后获取记录。有什么办法可以摆脱循环并获得 var 中所有 20 个项目的模式,然后你的代码就可以为我工作了
  • @Mohsin:在FMSG_IN 列中显示一些示例值。你确定你需要正则表达式吗?
  • 值将是列表中的投票数。一些例子是 1, 2 我的签名,我投票给 3,我最喜欢的是 4
  • 天哪,这正是我想要的。我想要完整的列表作为 1 个模式,而不是一个一个地循环。谢谢,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多