我有一個 ConcurentBag,其中 Bin 是 4 個成員的物件(int Max,in Min,int Avg,double median)。我在串列中有數百甚至數千個 Bin 物件,并且必須為每個成員計算 Max、Min、Avg 和 Medium:
binnedGeoData.Max = mSingleGpsBinList.Select(x => x.Max).Max();
binnedGeoData.Min = mSingleGpsBinList.Select(x => x.Min).Min();
binnedGeoData.Avg = (int)mSingleGpsBinList.Select(x => x.Avg).Average();
// Must convert to double[]
double[] medArray = mSingleGpsBinList.Select(x => (double)x.Median).ToArray();
binnedGeoData.Median = (int)Math.Round(Statistics.Median(medArray), 0);
但是,不知何故,所有計算的結果都給了我 0。例如,如果 bin1 的 Max 為 4,bi2n 為 8,bin3 為 2,則其中的 Max 將為 8,但結果為 0。
還有一件事:集合也可以改成 SerializedCollection...
有任何想法嗎?
uj5u.com熱心網友回復:
需要明確的是,“mSingleGpsBinList”是包含“4 個成員的 bin 物件”的串列,而“binnedGeoData”是另一個將保存 bin 串列的計算值的物件?為此,您選擇每個 Bin 的“Max”屬性,然后選擇這些值的 Max()。如果是這樣,那么您的代碼看起來都正確。我將首先驗證這些屬性是否已設定,并且 getter 確實回傳了一個非零值。
如果我的理解不正確,請告訴我并提供 mSingleGpsBinList 和 binnedGeoData 的型別
uj5u.com熱心網友回復:
您正在為每個運算子列舉一次源。
您應該考慮使用聚合運算子:
var source = Enumerable.Range(0, 100);
var x = source.Aggregate<int, (int? min, int? max, long? sum, int count), (int? min, int? max, long? sum, int? avg, int count)>(
default,
(acc, i) =>
{
if (!acc.min.HasValue || (i < acc.min.GetValueOrDefault()))
{
acc.min = i;
}
if (!acc.max.HasValue || (i > acc.max.GetValueOrDefault()))
{
acc.max = i;
}
acc.sum = acc.sum.GetValueOrDefault() i;
acc.count ;
return acc;
},
acc => (acc.min, acc.max, acc.sum, (int?)(acc.sum / acc.count), acc.count));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/524108.html
上一篇:為什么我的正則運算式回傳無?
