我试图在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中的两个scheduleResults
USAF:Eglin (1/1/2012-11/1/2012)USAF:Eglin (11/1/2012-3/31/2017)我可以看到,startDate实际上包含在endDate中,这就是我得到这两个结果的原因。我的问题是,如何在整个startDate上完全匹配,这样我就不会得到第二个结果了。
发布于 2013-09-06 16:30:36
假设格式保持不变,您只需在"(" + 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“的字段中,而这不是一个错误。如果可能,最好将数据元素存储在单独的列中。
发布于 2013-09-06 16:30:34
问题是,您的数据基本上是一种尴尬的格式。你可以设置你想要的完全匹配的格式,但这仍然是一个痛苦。
我建议您将每一行解析为包含所有组成部分(组织、名称、开始、结束?)的类型。使用DateTime作为开始/结束值(如果选择使用my 野田时间库.),则使用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包括在您的类型中。
发布于 2013-09-06 17:16:36
为此使用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();https://stackoverflow.com/questions/18662378
复制相似问题