2010-12-14 7 views
3

チャートに軸ラベルを追加するためのヘルパーメソッドが必要です。私は、それがあまりにも忙しくなるので、グラフに値を持つ軸に沿ったすべての点にラベルを追加したくありません。だから私は定期的にサンプルを抽出する必要があります。これまでのところ、私は要件を満たす次の方法を考え出しましたが、私はLinqでこれを達成するためのきちんとした方法が必要だと思います。どのようにこれをより簡潔にすることができるか考えてみてください(nは私が元に戻すサンプルの総数です)?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

サンプリングは素晴らしいAxisを提供しますか? MinとMaxを探し、log10算術を使ってスケールを作成します。ほとんどのチャートツールはそれをそうするでしょう。 –

+0

@Henk Holterman、出力を見て、私はあなたに同意する傾向があります。 – grenade

+0

この問題を解決するにはサンプリングが間違った方法でした。誰かが何か別のもののためにサンプラーを必要とするかもしれないので、私は質問を残すでしょうが、結局、私は上記の勧告を使用しました。あなたはここで結果を見ることができます:http://stackoverflow.com/questions/25458/how-costly-is-reflection-really/4440657#4440657 – grenade

答えて

4

フム、どの程度お試しください実際には問題はありませんが、少し複雑なものになります(の代わりにO(n)

+0

コードは非常に読みやすいわけではありませんが、私は考えが好きです。 – Kobi

3

私が正しく理解していれば:

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

ないように私:

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

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

私は、あなたが "サンプル"の代わりに "リスト"を意味したと思います... – MartinStettner

+0

はい、ありがとう.... – 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

このソリューションでは、反復処理で除算を使用することは避けられます。

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; 
    } 
} 
関連する問題