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

C# 根据条件过滤Lat Long值并取平均值,c#,asp.net-mvc,list,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 1

我的列表包含大量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;
                 });
这个方法返回了一些错误的数据,也不知道如何取这个平均值。
有人能帮我解决这个问题吗?

您可以使用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();
如果您希望最后只列出平均值,请将最后一行更改为:

select gr.Average()).ToList();
您将得到:

[
    148.01555056,
    148.01555146249999,
    148.01555243333334
]

148.0155506
不应该变成
148.015551
(即中点舍入)?@StephenMuecke不会,148.0155506不会被视为148.105551我在gr上有错误。平均值()i分组不包含平均值的定义你绝对肯定它说的是
i分组
?我想你在什么地方打错了。
[
    148.01555056,
    148.01555146249999,
    148.01555243333334
]