2017-12-15 14 views
1

私のリストには緯度経度の巨大なデータが含まれており、ファーム内のデータを扱っています。私は 小数点以下6桁のデータをフィルタリングすることを決めたので、私は1メートルまでの精度が必要な場合があります。フィルタLat条件と平均に基づいた長い値

私は、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 

だから出力は、第2のように以下の値の平均値等

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; 
       }); 

この方法は、いくつかの間違ったデータを、どのようにこの中で平均を取ることもありませんアイデアを返し仕事doesntの。 誰かがこれを解決するのを助けることができますか?

+0

「148.0155506」は「148.015551」(つまり、中点丸め)? –

+0

@StephenMuecke 148.0155506は処理されません148.105551 –

答えて

1

これを行うには、LINQを使用することができます:あなたがいうだけで平均値が変化するのリストで終わるたい場合

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

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 
] 
+0

gr.Average()IGrouping にはAverageの定義が含まれていません –

+0

IGrouping '?あなたはどこかでタイプミスがあると思います。 –

関連する問題