LINQ正好包含匹配

时间:2013-09-06 16:26:58

标签: 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>("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)
  3. 我可以看到startDate实际上包含endDate,这就是我得到这两个结果的原因。我的问题是,如何完全匹配整个startDate,所以我不会得到第二个结果。

3 个答案:

答案 0 :(得分: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();

(其中ParseRow是采用DataRow并返回适当类型的方法。)

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

答案 1 :(得分: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();

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

答案 2 :(得分: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();