使用LINQ2XML计算最大和最小日期

时间:2011-01-25 13:31:23

标签: linq linq-to-xml

也许是一个小问题,但我不明白这里出了什么问题。

下面的代码是针对XML文件(下面的示例),并尝试从Element'eventBlocks'的所有后代中的所有相同事件计算绝对最小日期和绝对最大日期。 (所有'EventC'元素的最早/最晚日期,......)

正如您所看到的,'ElementC'(对于eaxample)的其中一个结尾有一个endDate'1/14/2011'。这应该是我的MaxDateTo值。但结果显示计算出的maxEndDate为“1/6/2011”并忽略了正确的值。

我认为比较器将其作为字符串或int,并提供错误的结果。

我有什么(以及如何)来计算正确的最大和最小日期?

提前致谢 马库斯

 var xmlDoc = XDocument.Load(@"c:\Temp\MergedCalendar2011.xml");

    var result = from vb in xmlDoc.Descendants("eventBlock")
                 group vb by vb.Attribute("eventName").Value into blocks
                 orderby blocks.Key ascending
                 select new
                 {
                     BlockName = blocks.Key,
                     MinDateFrom = blocks.Min(min => min.Attribute("start").Value),
                     MaxDateTo = blocks.Max(max => max.Attribute("end").Value),
                 };

这是XML:

<?xml version="1.0" standalone="yes"?>
<year year="2011" id="year2011">  
  <state name="Baden Wuerttemberg" >
    <eventBlocks>
      <eventBlock eventName="EventX" start="4/21/2011" end="4/22/2011" />
      <eventBlock eventName="EventX" start="4/26/2011" end="5/1/2011" />
      <eventBlock eventName="EventZ" start="6/14/2011" end="6/26/2011" />
      <eventBlock eventName="EventA" start="7/28/2011" end="9/11/2011" />
      <eventBlock eventName="EventB" start="10/31/2011" end="11/1/2011" />
      <eventBlock eventName="EventB" start="11/2/2011" end="11/5/2011" />
      <eventBlock eventName="EventC" start="1/1/2011" end="1/14/2011" />
      <eventBlock eventName="EventC" start="12/23/2011" end="1/14/2012" />
    </eventBlocks>
  </state>
    <state name="Brandenburg" >   
    <eventBlocks>
      <eventBlock eventName="EventY" start="1/31/2011" end="2/6/2011" />
      <eventBlock eventName="EventX" start="4/20/2011" end="5/1/2011" />
      <eventBlock eventName="EventZ" start="6/3/2011" end="6/4/2011" />
      <eventBlock eventName="EventA" start="6/30/2011" end="8/14/2011" />
      <eventBlock eventName="EventB" start="10/4/2011" end="10/15/2011" />
      <eventBlock eventName="EventC" start="1/1/2011" end="1/2/2011" />
      <eventBlock eventName="EventC" start="12/23/2011" end="1/1/2012" />
    </eventBlocks>
  </state>
  <state name="Bremen">   
    <eventBlocks>
      <eventBlock eventName="EventY" start="1/31/2011" end="2/2/2011" />
      <eventBlock eventName="EventX" start="4/16/2011" end="5/1/2011" />
      <eventBlock eventName="EventZ" start="6/3/2011" end="6/4/2011" />
      <eventBlock eventName="EventZ" start="6/14/2011" end="6/15/2011" />
      <eventBlock eventName="EventA" start="7/7/2011" end="8/18/2011" />
      <eventBlock eventName="EventB" start="10/17/2011" end="10/30/2011" />
      <eventBlock eventName="EventC" start="1/1/2011" end="1/6/2011" />
      <eventBlock eventName="EventC" start="12/23/2011" end="1/1/2012" />
    </eventBlocks>
  </state>
  </year>

1 个答案:

答案 0 :(得分:1)

您应该在查询中将开始/结束字符串转换为日期:

MinDateFrom = blocks.Min(min => DateTime.ParseExact(min.Attribute("start").Value, "M/d/yyyy", CultureInfo.InvariantCulture)),
MaxDateTo = blocks.Max(max =>  DateTime.ParseExact(max.Attribute("end").Value, "M/d/yyyy", CultureInfo.InvariantCulture)),