有谁能启发我如何使用LINQ(或在需要时更合适的方法)创建一个整数列表的列表,这些列表按彼此的邻近程度进行分组。
基本上,我想创建数字在任何其他数字的5以内的组。
因此,鉴于:
3 27 53 79 113 129 134 140 141 142 145 174 191 214 284 284
产生以下列表:
3
27
53
79
113
129 134
140 141 142 145
174
194
214
284 284
谢谢!
最佳答案
LINQ不太擅长诸如滚动总和之类的事情。在这里,一个简单的foreach
循环更好:
static IEnumerable<IEnumerable<int>> GroupByProximity(
this IEnumerable<int> source, int threshold)
{
var g = new List<int>();
foreach (var x in source)
{
if ((g.Count != 0) && (x > g[0] + threshold))
{
yield return g;
g = new List<int>();
}
g.Add(x);
}
yield return g;
}
例子:
var source = new int[]
{
3, 27, 53, 79, 113, 129, 134, 140, 141, 142, 145, 174, 191, 214, 284, 284
};
foreach (var g in source.GroupByProximity(5))
{
Console.WriteLine(string.Join(", ", g));
}
输出:
3
27
53
79
113
129、134
140、141、142、145
174
191
214
284、284
关于c# - LINQ(或伪代码)按接近程度对项目进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6785085/