C# 使用linq对列表进行采样

C# 使用linq对列表进行采样,c#,linq,algorithm,C#,Linq,Algorithm,我需要一个辅助方法来向图表添加轴标签。我不想在图表中有值的轴上的每个点上添加标签,因为这样会太忙。所以我需要定期提取样本。到目前为止,我已经提出了以下满足要求的方法,但我认为必须有一种更简洁的方法来使用Linq实现这一点。有谁能想到如何使它更简洁(n表示我想要返回的样本总数) 公共静态列表示例(此列表,int n) { var samples=新列表(); var除数=list.Count/n; 对于(var i=0;i索引%interval==0)。ToList(); } Hm,那么: ret

我需要一个辅助方法来向图表添加轴标签。我不想在图表中有值的轴上的每个点上添加标签,因为这样会太忙。所以我需要定期提取样本。到目前为止,我已经提出了以下满足要求的方法,但我认为必须有一种更简洁的方法来使用Linq实现这一点。有谁能想到如何使它更简洁(n表示我想要返回的样本总数)

公共静态列表示例(此列表,int n)
{
var samples=新列表();
var除数=list.Count/n;
对于(var i=0;i
如果我理解正确:

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

公共静态列表示例(此列表,int n)
{
Int32 count=list.count;
Int32间隔=计数/n;
返回列表。其中((项,索引)=>索引%interval==0)。ToList();
}
Hm,那么:

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

这并不重要,但这给了您一个稍微好一点的复杂性(
O(n)
,而不是
O(list.Count)

这个解决方案避免了在迭代中使用除法,这应该会执行得更快

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;
    }
}
公共静态列表示例(此列表,int n)
{
return list.Sample(list.Count/n).ToList();
}
公共静态IEnumerable示例(此IEnumerable可枚举,int间隔){
var指数=0;
foreach(可枚举中的变量项){
如果(索引==0){
收益回报项目;
}
如果(++索引==间隔)索引=0;
}
}

你确定采样会给出一个很好的轴吗?我会寻找最小值和最大值,并使用log10算法建立一个刻度。大多数制图工具都会这样做。@Henk Holterman,看过输出后,我倾向于同意你的看法。采样是解决这个问题的错误方法。我留下这个问题,因为可能有人需要sa有一天,我尝试了其他一些东西,但最后,我确实使用了上面的建议。你可以在这里看到结果:
    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();
    }
return Enumerable.Range(0,n).Select(i=>list[(i*list.Count)/(n-1)]);
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;
    }
}