Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 我需要使linq运行取决于值是否为浮点_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

C# 我需要使linq运行取决于值是否为浮点

C# 我需要使linq运行取决于值是否为浮点,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我正在使用XDocument搜索大型XML文件。当用户查找数值时,我得到的值为十进制,我不区分整数和浮点值。我知道,假设来自XML的十进制输入是错误的,但如果不编写大量代码,就无法构建一个速记逻辑 用户在表单上输入要查找的值作为十进制,我通过在我的SearchCriteria对象中装箱,将所有筛选值保存为属性。然后,我使用以下代码查找匹配的元素: IEnumerable<XElement> allNodes = xDoc.Root.Descendants(root); allNode

我正在使用
XDocument
搜索大型XML文件。当用户查找数值时,我得到的值为
十进制
,我不区分整数和浮点值。我知道,假设来自XML的十进制输入是错误的,但如果不编写大量代码,就无法构建一个速记逻辑

用户在表单上输入要查找的值作为十进制,我通过在我的
SearchCriteria
对象中装箱,将所有筛选值保存为属性。然后,我使用以下代码查找匹配的元素:

IEnumerable<XElement> allNodes = xDoc.Root.Descendants(root);
allNodes = (from ex in allNodes 
    where ex.Descendants(fieldName)
        .Where(x => decimal.Parse(x.Value.Replace(".", ",")) == decimal.Parse(crit.SearchValue.ToString()))
        .Count() > 0 
    select ex);
IEnumerable allNodes=xDoc.Root.subjects(Root);
allNodes=(来自allNodes中的ex)
其中前子代(字段名)
其中(x=>decimal.Parse(x.Value.Replace(“.”,“,”))==decimal.Parse(crit.SearchValue.ToString())
.Count()>0
选择ex);
并获取邮政编码等字段的异常,因为它不包含任何小数点

我想做的是搜索所有值,不管它们是否包含小数点。但为了完成这项任务,我需要有一个逻辑来决定是否在比较之前替换小数点

在林克我怎么做


注意。

只需重写条件:

ex
   .Descendants(fieldName)
   .Where(x => {
      decimal dec;
      return
         decimal.TryParse(x.Value, NumberStyles.Number, culture, out dec) &&
         /* other conditions and comparison with dec */;
}
如果无法解析该值,则忽略该值


编辑:使用特定区域性分析数字。它将更快,占用更少的内存。还将解析的crit.SearchValue存储在lambda之外。

只需重写条件:

ex
   .Descendants(fieldName)
   .Where(x => {
      decimal dec;
      return
         decimal.TryParse(x.Value, NumberStyles.Number, culture, out dec) &&
         /* other conditions and comparison with dec */;
}
如果无法解析该值,则忽略该值


编辑:使用特定区域性分析数字。它将更快,占用更少的内存。还将解析后的crit.SearchValue存储在lambda之外。

无需将“.”替换为“,”。您可以查询decimal.Parse(s,NumberStyles.Any,newCultureInfo(“en”),它会工作的

通过将不需要重复的重复内容取出,可以使代码更加高效:

IEnumerable<XElement> allNodes = xDoc.Root.Descendants(root);
decimal match = decimal.Parse(crit.SearchValue.ToString());
CultureInfo culture = new CultureInfo("en");
allNodes = (from ex in allNodes where ex.Descendants(fieldName)
    .Where(x => decimal.Parse(x.Value, culture) == match)
    .Count() > 0 select ex);
IEnumerable allNodes=xDoc.Root.subjects(Root);
decimal match=decimal.Parse(crit.SearchValue.ToString());
CultureInfo culture=新的CultureInfo(“en”);
allNodes=(从所有节点中的ex开始,其中ex.substands(fieldName)
.Where(x=>decimal.Parse(x.Value,区域性)==match)
.Count()>0选择ex);

无需将“.”替换为“,”。您可以查询
decimal.Parse(s,NumberStyles.Any,new CultureInfo(“en”)
,它将正常工作

通过将不需要重复的重复内容取出,可以使代码更加高效:

IEnumerable<XElement> allNodes = xDoc.Root.Descendants(root);
decimal match = decimal.Parse(crit.SearchValue.ToString());
CultureInfo culture = new CultureInfo("en");
allNodes = (from ex in allNodes where ex.Descendants(fieldName)
    .Where(x => decimal.Parse(x.Value, culture) == match)
    .Count() > 0 select ex);
IEnumerable allNodes=xDoc.Root.subjects(Root);
decimal match=decimal.Parse(crit.SearchValue.ToString());
CultureInfo culture=新的CultureInfo(“en”);
allNodes=(从所有节点中的ex开始,其中ex.substands(fieldName)
.Where(x=>decimal.Parse(x.Value,区域性)==match)
.Count()>0选择ex);

我仍然想说,您提供的数据不足以解决这个问题。正如您的linq所做的和您所说的,您得到了邮政编码的一个例外-两者都处于相反的上下文中。您的邮政编码是否包含字母数字值?不要使用
字符串。以那种方式替换
。使用
XmlConvert.ToDecimal(x.Value)
decimal.Parse(x.Value,CultureInfo.InvariantCulture)
请预先分析您的搜索条件,而不是在每个查询中进行分析。但我要说的是,您提供的数据不足,无法解决问题。正如您的linq所做的和您所说的,您得到的邮政编码例外-两者都处于相反的上下文中。您的邮政编码是否包含字母数字值?不要使用
string、 以这种方式替换
。使用
XmlConvert.ToDecimal(x.Value)
decimal.Parse(x.Value,CultureInfo.InvariantCulture)
并请预先解析搜索条件,而不是在每个查询中。不幸的是,这无法正确执行筛选并返回错误的结果。我尚未检查结果是什么(由于要检查的记录很多)但是非常感谢您的努力,我肯定会使用Specsific区域性以减少内存消耗。不幸的是,这无法正确执行筛选并返回错误的结果。我尚未检查结果(由于要检查的记录很多)不过,非常感谢您的努力,我肯定会使用Specsific文化来减少内存消耗。