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
中返回两个数据行
-
USAF:Eglin (1/1/2012-11/1/2012)
-
USAF:Eglin (11/1/2012-3/31/2017)
我可以看到startDate
实际上包含在endDate
这就是我得到这两个结果的原因。 我的问题是,如何在整个startDate
上准确匹配,所以我不会返回第二个结果。
问题是你的数据基本上是以一种尴尬的格式。您可以格式化所需的完全匹配,但这仍然很痛苦。
我建议你将每一行解析为一个包含所有组成部分(组织、名称、开始、结束?)的类型,使用 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();