gpt4 book ai didi

c# - LINQ:将一系列字符串折叠成一组 "ranges"

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:31 25 4
gpt4 key购买 nike

我有一个类似于此的字符串数组(显示在不同的行上以说明模式):

{ "aa002","aa003","aa004","aa005","aa006","aa007", // note that aa008 is missing
"aa009"
"ba023","ba024","ba025"
"bb025",
"ca002","ca003",
"cb004",
...}

...目标是将这些字符串折叠成这个以逗号分隔的“范围”字符串:

"aa002-aa007,aa009,ba023-ba025,bb025,ca002-ca003,cb004, ... "

我想折叠它们以便构建 URL。有数百个元素,但如果我以这种方式折叠它们,我仍然可以传达所有信息 - 将它们全部放入“普通”URL(它必须是 GET,而不是 POST)是不可行的。

我曾想过使用前两个字符作为键将它们分成几组 - 但有没有人有任何聪明的想法将这些序列(没有间隙)折叠成范围?我正在为此苦苦挣扎,我想出的一切看起来都像意大利面条。

最佳答案

因此,您需要做的第一件事就是解析字符串。分开使用字母前缀和整数值很重要。

接下来您要对前缀上的项目进行分组。

对于该组中的每个项目,您希望按编号对它们进行排序,然后在前一个值的编号比当前项目的编号小 1 的情况下对项目进行分组。 (或者,换句话说,前一项加一等于当前项。)

将所有这些项目分组后,您希望根据该范围的前缀以及第一个和最后一个数字将这些项目投影到一个值。不需要这些组的其他信息。

然后,我们将每个组的字符串列表展平为一个常规字符串列表,因为一旦我们完成所有操作,就无需将范围与不同组分开。这是使用 SelectMany 完成的。

说完这些,翻译成代码就是这样:

public static IEnumerable<string> Foo(IEnumerable<string> data)
{
return data.Select(item => new
{
Prefix = item.Substring(0, 2),
Number = int.Parse(item.Substring(2))
})
.GroupBy(item => item.Prefix)
.SelectMany(group => group.OrderBy(item => item.Number)
.GroupWhile((prev, current) =>
prev.Number + 1 == current.Number)
.Select(range =>
RangeAsString(group.Key,
range.First().Number,
range.Last().Number)));
}

GroupWhile 方法可以这样实现:

public static IEnumerable<IEnumerable<T>> GroupWhile<T>(
this IEnumerable<T> source, Func<T, T, bool> predicate)
{
using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
yield break;

List<T> list = new List<T>() { iterator.Current };

T previous = iterator.Current;

while (iterator.MoveNext())
{
if (!predicate(previous, iterator.Current))
{
yield return list;
list = new List<T>();
}

list.Add(iterator.Current);
previous = iterator.Current;
}
yield return list;
}
}

然后是将每个范围转换为字符串的简单辅助方法:

private static string RangeAsString(string prefix, int start, int end)
{
if (start == end)
return prefix + start;
else
return string.Format("{0}{1}-{0}{2}", prefix, start, end);
}

关于c# - LINQ:将一系列字符串折叠成一组 "ranges",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com