0

我正在尝试在 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();

这将返回我的两个 DataRowsscheduleResults

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

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

4

3 回答 3

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

(接受 a并返回适当类型ParseRow的方法在哪里。)DataRow

如果您要使用大量值,您可能只想将您的值转换DataTable为适当的列表以开始。DataRow如果您需要能够获取这些行而不仅仅是数据,您始终可以在您的类型中包含源。

于 2013-09-06T16:30:34.793 回答
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();

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

于 2013-09-06T16:30:36.403 回答
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();
于 2013-09-06T17:16:36.370 回答