使用Regex和LINQ获取匹配和非匹配记录

时间:2015-10-20 08:28:55

标签: c# regex linq

我有一个包含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数据表的非匹配数据。

我怎样才能做到这一点。

1 个答案:

答案 0 :(得分:2)

如果您想在一个查询中同时获得两个结果,可以使用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;