LINQ 包含完全匹配

本文关键字:包含完 LINQ | 更新日期: 2023-09-27 18:30:24

我正在尝试在 DataRow 数组中查找一组条件的匹配项。

string startDate = "1/1/2012";
string endDate = "11/1/2012";
DataRow[] scheduleResults = myDataTable.AsEnumerable()
    .Where(r => r.Field<string>("Name").Contains("Eglin")
    && r.Field<string>("Name").Contains(startDate)
    && r.Field<string>("Name").Contains(endDate)).ToArray();

这会在scheduleResults中返回两个数据行

  1. USAF:Eglin (1/1/2012-11/1/2012)
  2. USAF:Eglin (11/1/2012-3/31/2017)

我可以看到startDate实际上包含在endDate这就是我得到这两个结果的原因。 我的问题是,如何在整个startDate上准确匹配,所以我不会返回第二个结果。

LINQ 包含完全匹配

问题是你的数据基本上是以一种尴尬的格式。您可以格式化所需的完全匹配,但这仍然很痛苦。

我建议你将每一行解析为一个包含所有组成部分(组织、名称、开始、结束?)的类型,使用 DateTime 作为开始/结束值(如果您选择使用我的 Noda 时间库,则LocalDate......此时,处理数据变得更加简单。查询将如下所示:

var query = myDataTable.AsEnumerable()
                       .Select(row => ParseRow)
                       .Where(p => p.Name.Contains("Eglin") &&
                                   p.StartDate == startDate &&
                                   p.EndDate == endDate)
                       .ToList();

(其中ParseRow是采用DataRow并返回适当类型的方法。

如果要使用大量值,则可能只想将DataTable转换为适当的列表。如果需要能够获取源DataRow,而不仅仅是数据,则始终可以在类型中包含源。

假设格式保持不变,您可以匹配"(" + startDate + "-" + endDate + ")"

string startDate = "1/1/2012";
string endDate = "11/1/2012";
DataRow[] scheduleResults = myDataTable.AsEnumerable()
    .Where(r => r.Field<string>("Name").Contains("Eglin")
    && r.Field<string>("Name").Contains("(" + startDate + "-" + endDate + ")"))
    .ToArray();

这是假设您的所有数据都在一个名为"名称"的字段中,这不是拼写错误。 如果可能,最好将数据元素存储在单独的列中。

为此使用 Regex 是完美的:

string name = "Eglin";
DataRow[] scheduleResults = 
        myDataTable.AsEnumerable()
        .Where(r => Regex.IsMatch(r.Field<string>("Name"),
                       string.Format(".*{0}.*{1}.*{2}", name, startDate, endDate)))
        .ToArray();