【问题标题】:Finding the average/mean value of numbers pulled from an xml file查找从 xml 文件中提取的数字的平均值/平均值
【发布时间】:2011-09-20 17:32:22
【问题描述】:

我有从 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) };

【问题讨论】:

  • 我想求提取出来的6个值的平均值。
  • @Casey:你试过什么?您可以发布您编写的代码以尝试找到平均值吗?简单的谷歌搜索就可以解决这个问题,这表明你在提问之前根本没有研究过这个问题:msdn.microsoft.com/en-us/vcsharp/aa336746
  • 请参阅上文,了解仅适用于 Xmax 的可能解决方案。我走对了吗?

标签: c# xml linq-to-xml average


【解决方案1】:
var averageMaximumX = query.Average(t => t.XMax);
var averageMinimumX = query.Average(t => t.XMin);
var averageMaximumY = query.Average(t => t.YMax);
var averageMinimumY = query.Average(t => t.YMin);
var averageMaximumZ = query.Average(t => t.ZMax);
var averageMinimumZ = query.Average(t => t.ZMin);

编辑:将字符串转换为双精度或小数或其他:

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.

【讨论】:

  • 有点不喜欢这段代码:无法将类型字符串转换为十进制无法将类型 lambda 表达式转换为委托类型
  • 我编辑了我的答案,以展示如何从您从 XML 获得的字符串中获取数字类型。
  • 谢谢你,我在从字符串转换为十进制时出错了。
  • 它有效,但我不喜欢你必须遍历集合 6 次的事实:-S
  • 好点。我想知道您是否可以使用 Linq 一次计算所有平均值。我想不出该怎么做(漫长的一天结束)。当然,您可以使用 foreach 循环来做到这一点。
【解决方案2】:

【讨论】:

  • 链接很好,但请在您的答案中说明解决方案的要点,以防链接中断。
【解决方案3】:

这是一种破解方法来获取答案,但我一点也不喜欢这种方法,我相信有一种正确的方法:

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;

尚未对其进行测试,但它应该可以工作,即使它是如此丑陋......

【讨论】:

  • 这行不通。你不能用 += 定义一个值,因为没有什么可以开始的。此外,匿名类型是不可变的,因此即使不在 new 语句的上下文中,也不能在匿名类型的属性上使用 +=。
  • 哼...我得回忆一下我过去是如何做这样的事情的。但无论如何,我会删除答案,因为它太丑了:-P
猜你喜欢
  • 2021-12-22
  • 2018-09-15
  • 2017-06-11
  • 2017-02-18
  • 2017-06-30
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多