C# 使用linq对列表进行采样
我需要一个辅助方法来向图表添加轴标签。我不想在图表中有值的轴上的每个点上添加标签,因为这样会太忙。所以我需要定期提取样本。到目前为止,我已经提出了以下满足要求的方法,但我认为必须有一种更简洁的方法来使用Linq实现这一点。有谁能想到如何使它更简洁(n表示我想要返回的样本总数)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
公共静态列表示例(此列表,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;
}
}