2010-12-14 25 views
3

Ich brauche eine Hilfsmethode zum Hinzufügen von Achsenbeschriftungen zu einem Diagramm. Ich möchte nicht an jeder Stelle entlang der Achse, die Werte im Diagramm enthält, eine Beschriftung hinzufügen, da dies zu sehr beansprucht würde. Also muss ich in regelmäßigen Abständen Proben entnehmen. Bis jetzt habe ich die folgende Methode entwickelt, die die Anforderungen erfüllt, aber ich denke, dass es eine bessere Möglichkeit geben muss, dies mit Linq zu erreichen. Kann jemand darüber nachdenken, wie dies präziser gemacht werden könnte (n steht für die Gesamtzahl der Samples, die ich zurück haben möchte)?Sampling einer Liste mit linq

public static List<T> Sample<T>(this List<T> list, int n) 
{ 
    var samples = new List<T>(); 
    var divisor = list.Count/n; 
    for (var i = 0; i < list.Count; i++) 
    if (samples.Count == i/divisor) 
     samples.Add(list[i]); 
    return samples; 
} 
+3

Sind Sie sicher, Sampling wird eine schöne Achse geben? Ich würde nach Min und Max suchen und eine Skala mit Log10-Arithmetik erstellen. Die meisten Charting-Tools werden es so machen. –

+0

@Henk Holterman, nachdem ich die Ausgabe angeschaut habe, bin ich geneigt, Ihnen zuzustimmen. – grenade

+0

Sampling war der falsche Weg, um dieses Problem zu lösen. Ich überlasse die Frage, weil vielleicht jemand eines Tages einen Sampler für etwas anderes braucht, aber am Ende habe ich die obige Empfehlung verwendet. Sie können das Ergebnis hier sehen: http://stackoverflow.com/questions/25458/how-costly-is-reflection-really/4440657#4440657 – grenade

Antwort

4

Hm, was ist:

return Enumerable.Range(0,n).Select(i=>list[(i*list.Count)/(n-1)]); 

nicht, dass ich Es ist wirklich wichtig, aber das gibt Ihnen eine etwas bessere Komplexität (O(n) statt O(list.Count)

+0

Obwohl der Code nicht sehr lesbar ist, mag ich die Idee. – Kobi

3

Wenn ich das richtig verstanden:

int divisor = list.Count/n; 
return list.Where((val, index) => index % divisor == 0).ToList(); 
0

Versuchen

list.Where((o, index) => index % divisor == 0) 
+0

Ich denke, du meintest "Liste" anstelle von "Proben" ... – MartinStettner

+0

Ja, danke .... – Aliostad

2
public static List<T> Sample<T>(this List<T> list, int n) 
    { 
     Int32 count = list.Count; 
     Int32 interval = count/n; 

     return list.Where((item, index) => index % interval == 0).ToList(); 
    } 
0

Diese Lösung vermeidet Division in der Iteration, die schneller ausführen sollte.

public static List<T> Sample<T>(this List<T> list, int n) 
{ 
    return list.Sample(list.Count/n).ToList(); 
} 

public static IEnumerable<T> Sample<T>(this IEnumerable<T> enumerable, int interval) { 
    var index = 0; 
    foreach (var item in enumerable) { 
     if (index == 0) { 
      yield return item; 
     } 
     if (++index == interval) index = 0; 
    } 
} 
Verwandte Themen