我正在尝试在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
,所以我不会得到第二个结果。
答案 0 :(得分:3)
问题是您的数据基本上处于尴尬的格式。你可以格式化你想要的完全匹配,但它仍然很痛苦。
我建议您使用DateTime
作为开始/结束值将每行解析为包含所有组成部分(组织,名称,开头,结尾?)的类型(或LocalDate
如果您选择使用我的Noda Time库...)。此时,处理数据变得更加简单。查询将类似于:
var query = myDataTable.AsEnumerable()
.Select(row => ParseRow)
.Where(p => p.Name.Contains("Eglin") &&
p.StartDate == startDate &&
p.EndDate == endDate)
.ToList();
(其中ParseRow
是采用DataRow
并返回适当类型的方法。)
如果您要使用大量值,则可能只想将DataTable
转换为适当的列表。如果您需要能够获取这些行而不仅仅是数据,则可以始终在您的类型中包含源DataRow
。
答案 1 :(得分:2)
假设格式保持不变,您可以在"(" + 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();
这假设您的所有数据都在一个名为“Name”的字段中,而不是拼写错误。如果可能,最好将数据元素存储在单独的列中。
答案 2 :(得分:0)
使用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();