根据条件过滤Lat Long值并取平均值

时间:2017-12-15 05:11:17

标签: c# asp.net-mvc list

我的列表包含lat lon值的大量数据,我正在处理服务器场中的数据。所以我可能需要高达1米的精度,所以我决定 过滤最多6个小数位的数据。

我需要获取具有相同lat lon值最多6位数的记录的平均lat lon值。

Sample data : 

148.0155503
148.0155504
148.0155506
148.0155507
148.0155508
148.015551
148.0155511
148.0155513
148.0155514
148.0155515
148.0155517
148.0155518
148.0155519
148.0155521
148.0155522
148.0155524
148.0155525
148.0155526
148.0155528

因此,输出将类似于列表中第一个对象的以下值的平均值

148.0155503
148.0155504
148.0155506
148.0155507
148.0155508

然后第二个就像以下值的平均值那样..

148.015551
148.0155511
148.0155513
148.0155514
148.0155515
148.0155517
148.0155518
148.0155519

所以最终输出看起来像

148.0155505
148.0155514
.
.
.

注意:这里我只采用lon值,同样的条件也应该应用于lat。

我尝试过以下方法,但它不起作用

var filteredList = soilData
                 .Skip(1)
                  .Aggregate(
                 soilData.Take(1).ToList(),
                 (a, x) =>
                 {
                     if (Math.Abs(x.Latitude-a.Last().Latitude) >= Convert.ToDecimal(.000001))
                     {
                         a.Add(x);
                     }
                     return a;
                 });

这个方法返回一些错误的数据,也不知道如何取平均值。 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以使用LINQ执行此操作:

var data = new List<double>
    {
        148.0155503,
        148.0155504,
        148.0155506,
        148.0155507,
        148.0155508,
        148.015551,
        148.0155511,
        148.0155513,
        148.0155514,
        148.0155515,
        148.0155517,
        148.0155518,
        148.0155519,
        148.0155521,
        148.0155522,
        148.0155524,
        148.0155525,
        148.0155526,
        148.0155528
    };

var filteredList = 
    (from item in data
     group item by Math.Floor(item * 1000000) / 1000000
     into gr
     select new {gr.Key, Average = gr.Average()}).ToList();

你最终会得到这个:

[
    {
        "Key": 148.01555,
        "Average": 148.01555056
    },
    {
        "Key": 148.015551,
        "Average": 148.01555146249999
    },
    {
        "Key": 148.015552,
        "Average": 148.01555243333334
    }
]

如果您最终只得到平均值列表,请将最后一行更改为:

select gr.Average()).ToList();

你会得到:

[
    148.01555056,
    148.01555146249999,
    148.01555243333334
]