Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在xml数据的linq查询中使用TryParse?_C#_Xml_Linq - Fatal编程技术网

C# 如何在xml数据的linq查询中使用TryParse?

C# 如何在xml数据的linq查询中使用TryParse?,c#,xml,linq,C#,Xml,Linq,我正在处理每日股市数据的内存xml,我得到其中一个日期的值“8/221/19055”。我认为TryParse可能是我检查有效日期的最佳选择,但MSDN文档似乎对第二个参数“out DateTime result”的解释很简单。我如何在下面的linq查询中使用它 var makeInfo = from s in doc.Descendants("quote") where s.Element("LastTradeDate") != null

我正在处理每日股市数据的内存xml,我得到其中一个日期的值“8/221/19055”。我认为TryParse可能是我检查有效日期的最佳选择,但MSDN文档似乎对第二个参数“out DateTime result”的解释很简单。我如何在下面的linq查询中使用它

var makeInfo =
         from s in doc.Descendants("quote")
         where s.Element("LastTradeDate") != null
                && s.Attribute("symbol") != null
         let dateStr = s.Element("LastTradeDate").Value
         where !string.IsNullOrEmpty(dateStr)
                && DateTime.Parse(dateStr, enUS) == targetDate
         select new DailyPricingVolDP((string)s.Attribute("symbol"),
                                      (DateTime)s.Element("LastTradeDate"),
                                      (double)s.Element("Open"),
                                      (double)s.Element("DaysHigh"),
                                      (double)s.Element("DaysLow"),  
                                      (double)s.Element("LastTradePriceOnly"),
                                       (long)s.Element("Volume"));

要消除
TryParse
out
参数,可以在通用委托中抽象整个解析,如标准
转换器

Func tryToGetDate=
值=>
{
日期时间日期值;
return DateTime.TryParse(value,out dateValue)?(DateTime?)dateValue:null;
};
var makeInfo=
从文件子体中的s(“引用”)
其中s.Element(“LastTradeDate”)!=无效的
&&s.属性(“符号”)!=无效的
让dateStr=s.Element(“LastTradeDate”).Value
让dateValue=tryToGetDate(dateStr)
其中dateValue!=null&(DateTime)dateValue==targetDate
选择。。。。等等

它可以被重构成这样,而不需要函数和一个简单的查询来完成同样的工作:

var makeInfo = from s in doc.Descendants("quote")
    where s.Attribute("symbol").HasValue 
    && s.Element("LastTradeDate").HasValue 
    && DateTime.Parse(Element("LastTradeDate").Value) == targetDate
    select .... etc etc

你是否尝试过先将输出保存到一个变量中,然后比较你linq中的两个日期xml@Boomer谢谢,看起来这(或某种形式的逻辑)将是解决方案,现在来看看这些..当你将“8/221/19055”传递给它(作为str)时,它会做什么?这只是一个通过泛型委托抽象TryParse以消除out参数的想法。您可以使用
Func
传递更多参数,并根据您的业务逻辑分析解析问题。。这看起来是实现我的结构化方式的最直接的方法。再看一次,你根本不需要try-parse。只需使用HasValue:where s.Element(“LastTradeDate”).HasValue&&where s.Element(“LastTradeDate”)==targetDate我认为这样做可以使queryNullable.HasValue中的let值无效。比如:。。。其中dateValue.HasValue&&dateValue.Value==targetDate@Andy我现在正在实施你的修复,谢谢你向我介绍Func类型。谢谢。。。我是linq新手,所以我不知道如何将它合并到我的var=语句中。你的意思是这就是全部内容,包括检查错误的日期值吗?你的xml是否有一个模式,可以验证它是否声明LastTradeDate是一个日期,在这种情况下,你知道它将是一个有效日期?
Converter<string, DateTime> converter = (str) =>
                {
                    DateTime dateTime;
                    if (!DateTime.TryParse(str, out dateTime))
                    {
                       // custom business logic for such cases
                       dateTime = DateTime.MinValue;
                    }

                    return dateTime;
                };
converter(rawString) == targetDate
Func<string, DateTime?> tryToGetDate =
        value =>
            {
                DateTime dateValue;
                return DateTime.TryParse(value, out dateValue) ? (DateTime?) dateValue : null;
            };

    var makeInfo =
         from s in doc.Descendants("quote")
         where s.Element("LastTradeDate") != null
                && s.Attribute("symbol") != null
         let dateStr = s.Element("LastTradeDate").Value
         let dateValue = tryToGetDate(dateStr)
         where dateValue != null && (DateTime)dateValue == targetDate
         select .... etc etc
var makeInfo = from s in doc.Descendants("quote")
    where s.Attribute("symbol").HasValue 
    && s.Element("LastTradeDate").HasValue 
    && DateTime.Parse(Element("LastTradeDate").Value) == targetDate
    select .... etc etc