我正在寻找一种计算给定数字集合范围的方法,例如:
如果我有H555、H567、H589、H590、H591、H592、H593、H594、H595、H596、H597
我希望得到的输出是H555、H567和H589-H597。
我已经查看了相关问题,但没有找到类似于我所需内容的答案。
谢谢
我正在寻找一种计算给定数字集合范围的方法,例如:
如果我有H555、H567、H589、H590、H591、H592、H593、H594、H595、H596、H597
我希望得到的输出是H555、H567和H589-H597。
我已经查看了相关问题,但没有找到类似于我所需内容的答案。
谢谢
首先,我会这样:
public sealed class Range
{
public int Low { get; private set; }
public int High { get; private set; }
public Range(int low, int high)
{
this.Low = low;
this.High = high;
}
}
那么(完全未经测试,甚至可能无法编译,但希望您能理解):
public static IEnumerable<Range> FindRanges(IEnumerable<int> values)
{
using (IEnumerator<int> iterator = values.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield break;
}
int low = iterator.Current;
int high = low;
while (iterator.MoveNext())
{
int next = iterator.Current;
if (next > high + 1)
{
// Previous range (or possibly single value) has finished
yield return new Range(low, high);
low = next;
}
high = next;
}
// Yield trailing range
yield return new Range(low, high);
}
}
var numbers = strings.Select(x => int.Parse(x.Substring(1));
var ranges = FindRanges(numbers);
var rangeStrings = ranges.Select(r => r.High == r.Low
? "H" + r.Low : "H" + r.Low + "-" + r.High);
var result = string.Join(",", rangeStrings);
我认为在这里使用Linq实在是太过繁琐,但如果你想要用的话,以下是代码:
int[] arr = { 555, 567, 589, 590, 591, 592, 593, 594, 595, 596, 597 };
int gr = 0;
var q = arr
.Skip(1)
.Select((x, i) => new { x, group = (x - arr[i]) == 1 ? gr : gr++ })
.GroupBy( a => a.group)
.Select(
a => a.Count() == 1
? a.First().x.ToString()
: string.Format("{0}-{1}", a.First().x, a.Last().x));
foreach (var item in q)
{
Console.Write(item);
Console.Write(", ");
}