Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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文件中提取的数字的平均值_C#_Xml_Linq To Xml_Average - Fatal编程技术网

C# 查找从xml文件中提取的数字的平均值

C# 查找从xml文件中提取的数字的平均值,c#,xml,linq-to-xml,average,C#,Xml,Linq To Xml,Average,我有从XML文件中提取数据的代码。我想找到每个提取值XMax、XMin、YMax、YMin、ZMax、ZMin的平均值 下面是我如何提取六个值的: var query = from file in fileEntries let doc = XDocument.Load(file) let x = doc.Descendants("XAxisCalib").Single() let y = doc.Descendants

我有从XML文件中提取数据的代码。我想找到每个提取值XMax、XMin、YMax、YMin、ZMax、ZMin的平均值

下面是我如何提取六个值的:

var query = from file in fileEntries
            let doc = XDocument.Load(file) 
            let x = doc.Descendants("XAxisCalib").Single() 
            let y = doc.Descendants("YAxisCalib").Single() 
            let z = doc.Descendants("ZAxisCalib").Single() 
            select new
            {
                XMax = x.Element("Max").Value, 
                XMin = x.Element("Min").Value, 
                YMax = y.Element("Max").Value, 
                YMin = y.Element("Min").Value, 
                ZMax = z.Element("Max").Value, 
                ZMin = z.Element("Min").Value 
            };
我的XMax平均值是否正确:

 var Average1 =
    from a in query
    select new 
    { AvgMaxX =  a.Average(a => a.XMax) };
这有用吗

编辑:要将字符串转换为双精度或小数或其他形式,请执行以下操作:

var averageMaximumX = query.Average(t => double.Parse(t.XMax));
//OR: var averageMaximumX = query.Average(t => decimal.Parse(t.XMax));
但实际上我会在选择中这样做:

select new
{
    XMax = double.Parse(x.Element("Max").Value),
    XMin = double.Parse(x.Element("Min").Value),
// etc.

这里有一种方法可以帮助你获得答案,但我一点也不喜欢这样,我相信有一种合适的方法:

double aXMax = 0;
double aXMin = 0;
double aYMax = 0;
double aYMin = 0;
double aZMax = 0;
double aZMin = 0;

int count = (from file in fileEntries
        let doc = XDocument.Load(file) 
        let x = doc.Descendants("XAxisCalib").Single() 
        let y = doc.Descendants("YAxisCalib").Single() 
        let z = doc.Descendants("ZAxisCalib").Single() 
        select new
        {
            aXMax += x.Element("Max").Value, 
            aXMin += x.Element("Min").Value, 
            aYMax += y.Element("Max").Value, 
            aYMin += y.Element("Min").Value, 
            aZMax += z.Element("Max").Value, 
            aZMin += z.Element("Min").Value 
        }).Count();

aXMax /= (double)count;
aXMin /= (double)count;
aYMax /= (double)count;
aYMin /= (double)count;
aZMax /= (double)count;
aZMin /= (double)count;

我还没有测试出来,但应该可以,即使它很难看…

我想找出提取出来的6个值的平均值。@Casey:你试过什么?你能把你写的代码贴出来试着找出平均值吗?简单的谷歌搜索就可以解决这个问题,这表明你在问这个问题之前根本没有研究过这个问题:请参阅上文,以获得针对Xmax的可能解决方案。我走对了吗?链接很好,但是,如果链接中断,请将解决方案的要点放在您的答案中。一点也不喜欢这段代码:无法将类型字符串转换为十进制无法将类型lambda表达式转换为委托类型我编辑了我的答案,以演示如何从XML中获得的字符串中获取数字类型。谢谢,我在转换时出错了从字符串到小数。这是可行的,但我不喜欢这样一个事实,即必须在集合中迭代6次:-SGood point。我想知道你是否能用Linq计算出一次传球的所有平均值。在漫长的一天里,我想不出该怎么做。当然,你可以用foreach循环来实现,但这行不通。不能用+=定义值,因为没有任何开头。此外,匿名类型是不可变的,因此即使它不在新语句的上下文中,也不能在匿名类型的属性上使用+=。。。我得回忆一下我过去是怎么做的。但是无论如何,我会删除答案,因为它太难看了
double aXMax = 0;
double aXMin = 0;
double aYMax = 0;
double aYMin = 0;
double aZMax = 0;
double aZMin = 0;

int count = (from file in fileEntries
        let doc = XDocument.Load(file) 
        let x = doc.Descendants("XAxisCalib").Single() 
        let y = doc.Descendants("YAxisCalib").Single() 
        let z = doc.Descendants("ZAxisCalib").Single() 
        select new
        {
            aXMax += x.Element("Max").Value, 
            aXMin += x.Element("Min").Value, 
            aYMax += y.Element("Max").Value, 
            aYMin += y.Element("Min").Value, 
            aZMax += z.Element("Max").Value, 
            aZMin += z.Element("Min").Value 
        }).Count();

aXMax /= (double)count;
aXMin /= (double)count;
aYMax /= (double)count;
aYMin /= (double)count;
aZMax /= (double)count;
aZMin /= (double)count;