找到最小值 date/usage 和最大值 date/usage
finding the min date/usage and max date/usage
我需要一些帮助。我有一个 XML 账单,其中有多个相同的节点。现在我循环遍历节点并相应地合并值。我向您展示的代码只是我需要帮助的部分。该循环包含更多我将值合并在一起的地方。我需要帮助的是选择 MIN 和 MAX dates/usages。因为我现在要返回多个节点而不是一个节点,所以我将循环并合并数据。
- 所以在循环遍历节点后,我需要将 UsageMeterReadStartDate 设置为最早的 MIN 日期。数据类型字符串
- 与 UsageMeterReadStartUsage 相同。数据类型字符串
- 所以在循环遍历节点后,我需要将 UsageMeterReadStartDate 设置为最新的 MAX 日期。数据类型字符串
- 与 UsageMeterReadEndUsage 相同
这就是我所坚持的。我已经完成了我需要的所有其他数据的合并。我今年 18 岁,是一个非常新的程序员。我只是迷失在自己的逻辑中。任何指导都会帮助我。我相信最后两个 IF 语句是我需要帮助的地方,也是逻辑所在。
我想你要做的是首先循环遍历所有项目。将它们转换为 DateTime
对象。 DateTime
对象可让您比较其他对象的大于或小于。不过我认为,您会陷入年份转换,因为您没有在源代码中进行跟踪。
if (meterReadStartXMLNodes.Count > 0 && meterReadStartXMLNodes[0].HasChildNodes)
{ // This is to fill up the meter read start date and meter read start usage as an attribute of the "sadetails" node in the newer XML.
DateTime oldDateTime = DateTime.Now;
string oldUsage = "";
foreach (var node in meterReadStartXMLNodes)
{
DateTime tempDateTime = DateTime.Parse(String.Format("{0} {1}", meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_STRT_DT_MM.USAGE").InnerText,
meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_STRT_DT_DD.USAGE").InnerText));
if (tempDateTime < oldDateTime)
{
// Any time you've determined you have an older date, we capture the usage for that date
oldDateTime = tempDateTime;
oldUsage = meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_KWH_PRV_MTR_READ.USAGE").InnerText;
}
}
// By the time you get here, you've already determined the lowest date/time, format it.
saBillDetail.UsageMeterReadStartDate = oldDateTime.ToString("MMM dd");
saBillDetail.UsageMeterReadStartUsage = oldUsage;
}
对于结束日期,您可以做同样的事情,只是不需要为其分配一个值,它将默认为 0001 年。
if (meterReadEndXMLNodes.Count > 0 && meterReadEndXMLNodes[0].HasChildNodes)
{ // This is to fill up the meter read end date and meter read end usage as an attribute of the "sadetails" node in the newer XML.
DateTime latestDateTime = new DateTime();
string latestUsage = "";
foreach (var node in meterReadStartXMLNodes)
{
DateTime tempDateTime = DateTime.Parse(String.Format("{0} {1}", meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_END_DT_MM.USAGE").InnerText,
meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_END_DT_DD.USAGE").InnerText));
if (tempDateTime > latestDateTime)
{
// Any time you've determined you have an newer date, we capture the usage for that date
latestDateTime = tempDateTime;
latestUsage = meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_KWH_MTR_READ.USAGE").InnerText;
}
}
saBillDetail.UsageMeterReadEndDate = latestDateTime.ToString("MMM dd");
saBillDetail.UsageMeterReadEndUsage = latestUsage;
}
当然,我没有测试这些东西,但它应该可以让你继续,你可以修复错误。由于您是编程新手,您了解我所做的事情吗?
我需要一些帮助。我有一个 XML 账单,其中有多个相同的节点。现在我循环遍历节点并相应地合并值。我向您展示的代码只是我需要帮助的部分。该循环包含更多我将值合并在一起的地方。我需要帮助的是选择 MIN 和 MAX dates/usages。因为我现在要返回多个节点而不是一个节点,所以我将循环并合并数据。
- 所以在循环遍历节点后,我需要将 UsageMeterReadStartDate 设置为最早的 MIN 日期。数据类型字符串
- 与 UsageMeterReadStartUsage 相同。数据类型字符串
- 所以在循环遍历节点后,我需要将 UsageMeterReadStartDate 设置为最新的 MAX 日期。数据类型字符串
- 与 UsageMeterReadEndUsage 相同
这就是我所坚持的。我已经完成了我需要的所有其他数据的合并。我今年 18 岁,是一个非常新的程序员。我只是迷失在自己的逻辑中。任何指导都会帮助我。我相信最后两个 IF 语句是我需要帮助的地方,也是逻辑所在。
我想你要做的是首先循环遍历所有项目。将它们转换为 DateTime
对象。 DateTime
对象可让您比较其他对象的大于或小于。不过我认为,您会陷入年份转换,因为您没有在源代码中进行跟踪。
if (meterReadStartXMLNodes.Count > 0 && meterReadStartXMLNodes[0].HasChildNodes)
{ // This is to fill up the meter read start date and meter read start usage as an attribute of the "sadetails" node in the newer XML.
DateTime oldDateTime = DateTime.Now;
string oldUsage = "";
foreach (var node in meterReadStartXMLNodes)
{
DateTime tempDateTime = DateTime.Parse(String.Format("{0} {1}", meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_STRT_DT_MM.USAGE").InnerText,
meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_STRT_DT_DD.USAGE").InnerText));
if (tempDateTime < oldDateTime)
{
// Any time you've determined you have an older date, we capture the usage for that date
oldDateTime = tempDateTime;
oldUsage = meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_KWH_PRV_MTR_READ.USAGE").InnerText;
}
}
// By the time you get here, you've already determined the lowest date/time, format it.
saBillDetail.UsageMeterReadStartDate = oldDateTime.ToString("MMM dd");
saBillDetail.UsageMeterReadStartUsage = oldUsage;
}
对于结束日期,您可以做同样的事情,只是不需要为其分配一个值,它将默认为 0001 年。
if (meterReadEndXMLNodes.Count > 0 && meterReadEndXMLNodes[0].HasChildNodes)
{ // This is to fill up the meter read end date and meter read end usage as an attribute of the "sadetails" node in the newer XML.
DateTime latestDateTime = new DateTime();
string latestUsage = "";
foreach (var node in meterReadStartXMLNodes)
{
DateTime tempDateTime = DateTime.Parse(String.Format("{0} {1}", meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_END_DT_MM.USAGE").InnerText,
meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_USG_END_DT_DD.USAGE").InnerText));
if (tempDateTime > latestDateTime)
{
// Any time you've determined you have an newer date, we capture the usage for that date
latestDateTime = tempDateTime;
latestUsage = meterReadStartXMLNodes[0].SelectSingleNode("IRBILGU_US_KWH_MTR_READ.USAGE").InnerText;
}
}
saBillDetail.UsageMeterReadEndDate = latestDateTime.ToString("MMM dd");
saBillDetail.UsageMeterReadEndUsage = latestUsage;
}
当然,我没有测试这些东西,但它应该可以让你继续,你可以修复错误。由于您是编程新手,您了解我所做的事情吗?