2016-03-19 15 views
4

Bazı kıyaslama testlerinin sonuçlarını içeren bir sınıfa sahibim. sınıf az ya da çok şuna benzer: Tüm testleri defalarca yayınlanıyorduysaİki değerle gruplandırma ve üçüncü bir hesaplama

public class TestResult 
{ 
    public string TestName { get; set; } 
    public int SampleSize { get; set; } 
    public double Result { get; set; } 
} 

, bu yüzden gibi, her numune boyutu için birçok sonucu: Artık

TestName: "MemoryTest", SampleSize: 1024, Result: 2.4741 
TestName: "MemoryTest", SampleSize: 1024, Result: 2.5029 
TestName: "MemoryTest", SampleSize: 1024, Result: 2.4902 
TestName: "MemoryTest", SampleSize: 2048, Result: 4.5654 
TestName: "MemoryTest", SampleSize: 2048, Result: 4.7156 
TestName: "MemoryTest", SampleSize: 2048, Result: 4.2238 
TestName: "MemoryTest", SampleSize: 4096, Result: 10.1863 
TestName: "MemoryTest", SampleSize: 4096, Result: 9.9471 
TestName: "MemoryTest", SampleSize: 4096, Result: 10.2240 

TestName: "GraphicsTest", SampleSize: 1024, Result: 2.4741 
TestName: "GraphicsTest", SampleSize: 1024, Result: 2.5029 
TestName: "GraphicsTest", SampleSize: 1024, Result: 2.4902 
TestName: "GraphicsTest", SampleSize: 2048, Result: 4.5654 
TestName: "GraphicsTest", SampleSize: 2048, Result: 4.7156 
TestName: "GraphicsTest", SampleSize: 2048, Result: 4.2238 
TestName: "GraphicsTest", SampleSize: 4096, Result: 10.1863 
TestName: "GraphicsTest", SampleSize: 4096, Result: 9.9471 
TestName: "GraphicsTest", SampleSize: 4096, Result: 10.2240 

Ben oluşturmak istiyorum Tüm sonuçların ortalamasını içeren, ancak hem TestName hem de SampleSize tarafından gruplandırılmış liste.

Yukarıdaki örnekte, her SampleSize için ortalamalar ile birlikte 6 sonuç için: 3 GraphicTest ve 3 for MemoryTest içeren bir listeye sahip olmak istiyorum.

İki farklı sütuna göre gruplandırmada sorun yaşıyorum.

 var _Consolidation = 
      from _R in Results 
      group _R by new { _R.TestName, _R.SampleSize } into _G 
      select new TestResult() 
      { 
       TestName = _G.Key.TestName, 
       SampleSize = _G.Key.SampleSize, 
       Result = from _Res 
         in Results 
         where _Res.TestName == _G.Key.TestName && _Res.SampleSize == _G.Key.SampleSize 
         select _X => new 
         { 
          // ? Average Result? How to calculate it? 
         } 
      }; 

Ama ben emin değilim:

Benim iyi yaklaşım şimdiye kadar olduğunu ... Birkaç yollarını denedim, ama üzerinde bir kavrayışa alamayan Doğru yoldan gidiyorum.

cevap

1

ardından gruplama ortalama basitçe grubun koleksiyonuna karşı bir ortalamadır:

var query = items 
    .GroupBy(x => new {x.TestName, x.SampleSize}) 
    .Select(x => new TestResult 
    { 
     TestName = x.Key.TestName, 
     SampleSize = x.Key.SampleSize, 
     Result = x.Average(y => y.Result) 
    }); 

gruplama anlamanın anahtarı Bir grup temelde anahtarın gruplandırdığınız şey olduğu ve değerin grup seçicisiyle karşılaşan tüm öğelerin bir koleksiyonu olduğu anahtar/değer toplamadır; koleksiyon, her grup için karşı koymaktan daha fazlasıdır.

2

Bir resultselector kullanılarak GroupBy ait this overload kullanabilirsiniz:

var result = tests.GroupBy(t => new { t.TestName, t.SampleSize }, 
      (k, v) => new 
      { 
       SampleSize = k.SampleSize, 
       TestName = k.TestName, 
       Average = v.Average(t => t.Result) 
      }); 

k(k, v) size göre gruplandırılmış ve v her gruptaki tüm unsurlardır anahtarıdır.

Sen, sahip anonim bir türüne göre grubuna yakın ihtiyacımız var
İlgili konular