【问题标题】:LINQ Contains Match ExactlyLINQ 包含完全匹配
【发布时间】:2013-09-06 16:26:57
【问题描述】:

我正在尝试在 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 中的两个 DataRows

  1. USAF:Eglin (1/1/2012-11/1/2012)
  2. USAF:Eglin (11/1/2012-3/31/2017)

我可以看到startDate 实际上包含在endDate 中,这就是我得到这两个结果的原因。我的问题是,如何准确匹配整个 startDate,所以我不会返回第二个结果。

【问题讨论】:

  • 您的数据表是否包含标题为“姓名”的单列,其中包含姓名、职务代码、开始日期和结束日期?
  • 是的,不幸的是,我从中提取此信息的数据库刚刚设置了一个 ID 字段和一个“名称”字段,并且设置的约定是只包含相关的开始/结束日期等信息输入“名称”字段。绝对不理想,但这就是我现在必须要做的事情。

标签: c# linq contains


【解决方案1】:

问题在于您的数据基本上采用了一种尴尬的格式。你可以格式化你想要的完全匹配,但这仍然很痛苦。

我建议您将每一行解析为包含所有组成部分(组织、名称、开始、结束?)的类型,使用 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

【讨论】:

  • 看起来OP的数据没有任何StartDateEndDate字段,只是字符串类型的Name
  • @KingKing:重读了这个问题,我明白你的意思了。删除和编辑。
【解决方案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();

这是假设您的所有数据都在一个名为“名称”的字段中,这不是拼写错误。如果可能,最好将数据元素存储在单独的列中。

【讨论】:

  • 这将不正确地匹配“USAF:Elgin (11/1/2012-11/1/2012)”,我建议将第二个包含检查 .Contains(String.Format("({0}-{1})",startDate,endDate))
【解决方案3】:

使用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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2020-09-07
    相关资源
    最近更新 更多