Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ包含精确匹配_C#_Linq_Contains - Fatal编程技术网

C# LINQ包含精确匹配

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

我试图在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();
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”字段和已设置的约定仅包括相关信息,如开始/结束