C# LINQ包含精确匹配
我试图在DataRow数组中查找一组条件的匹配项C# LINQ包含精确匹配,c#,linq,contains,C#,Linq,Contains,我试图在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>("Nam
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();
string startDate=“1/1/2012”;
字符串endDate=“11/1/2012”;
DataRow[]scheduleResults=myDataTable.AsEnumerable()
其中(r=>r.Field(“Name”)。包含(“Eglin”)
&&r.字段(“名称”)。包含(起始日期)
&&r.Field(“Name”).Contains(endDate)).ToArray();
这将在scheduleResults
USAF:Eglin(2012年1月1日-2012年11月1日)
USAF:Eglin(2012年11月1日-2017年3月31日)
我可以看到
startDate
实际上包含在endDate
中,这就是我得到这两个结果的原因。我的问题是,如何准确地匹配整个起始日期,这样我就不会返回第二个结果。问题是,您的数据基本上是一种不方便的格式。你可以格式化你想要的精确匹配,但这仍然是一件痛苦的事
我建议您使用DateTime
作为开始/结束值(或者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
,而不仅仅是数据,则可以始终在您的类型中包含源DataRow
。问题在于,您的数据基本上是一种笨拙的格式。你可以格式化你想要的精确匹配,但这仍然是一件痛苦的事
我建议您使用DateTime
作为开始/结束值(或者LocalDate
如果您选择使用我的库…),将每一行解析为包含所有组成部分(组织、名称、开始、结束?)的类型。在这一点上,处理数据就变得简单多了。该查询类似于:
var query = myDataTable.AsEnumerable()
.Select(row => ParseRow)
.Where(p => p.Name.Contains("Eglin") &&
p.StartDate == startDate &&
p.EndDate == endDate)
.ToList();
(其中,ParseRow
将是一种采用DataRow
并返回适当类型的方法。)
若要处理大量的值,您可能只需要将DataTable
转换为一个合适的列表即可。如果您需要能够获取源数据行,而不仅仅是数据行,则可以始终在类型中包含源数据行。假设格式保持不变,您可以只在“(“+startDate+”-“+endDate+”)上进行匹配。
string startDate=“1/1/2012”;
字符串endDate=“11/1/2012”;
DataRow[]scheduleResults=myDataTable.AsEnumerable()
其中(r=>r.Field(“Name”)。包含(“Eglin”)
&&r.字段(“名称”)包含(“(“+startDate+”-“+endDate+”))
.ToArray();
这是假设您的所有数据都在一个名为“Name”的字段中,而这不是输入错误。如果可能,最好将数据元素存储在单独的列中。假设格式保持不变,您只需在“(“+startDate+”-“+endDate+”)上匹配即可。
string startDate=“1/1/2012”;
字符串endDate=“11/1/2012”;
DataRow[]scheduleResults=myDataTable.AsEnumerable()
其中(r=>r.Field(“Name”)。包含(“Eglin”)
&&r.字段(“名称”)包含(“(“+startDate+”-“+endDate+”))
.ToArray();
这是假设您的所有数据都在一个名为“Name”的字段中,而这不是输入错误。如果可能的话,最好将数据元素存储在单独的列中。使用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();
string name=“Eglin”;
DataRow[]scheduleResults=
myDataTable.AsEnumerable()
.Where(r=>Regex.IsMatch(r.Field(“Name”),
string.Format(“.*{0}.*{1}.*{2}”,name,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();
string name=“Eglin”;
DataRow[]scheduleResults=
myDataTable.AsEnumerable()
.Where(r=>Regex.IsMatch(r.Field(“Name”),
string.Format(“.*{0}.*{1}.*{2}”,name,startDate,endDate)))
.ToArray();
如果与“USAF:Elgin(11/1/2012-11/1/2012)”不匹配,我建议进行第二次包含检查.contains(String.Format(({0}-{1})”,startDate,endDate))
如果与“USAF:Elgin(11/1/2012-11/1/2012)”不匹配,我建议进行第二次包含检查.contains(String.Format(({0}-{1})”,startDate,endDate))
看起来OP的数据没有任何startDate
和endDate
字段,只是Name
类型的字符串?@KingKing:重读了这个问题,我明白你的意思了。删除和编辑。看起来OP的数据没有任何StartDate
和EndDate
字段,只是Name
类型的字符串?@KingKing:重读这个问题,我明白你的意思了。删除和编辑。您的数据表是否包含一个标题为“Name”的列,其中包含名称、职务代码、开始日期和结束日期?是的,很遗憾,我从中提取此信息的数据库刚刚设置了一个ID字段和一个“Name”字段和已设置的约定只是将相关信息(如开始/结束日期)包括在“名称”字段中。当然不是很理想,但这正是我目前必须处理的问题。您的数据表包含一个名为“Name”的列,其中包含名称、职务代码、开始日期和结束日期,这是否正确?是的,很遗憾,我从中提取此信息的数据库刚刚设置了一个ID字段和一个“Name”字段和已设置的约定仅包括相关信息,如开始/结束