我的问题是,如果我有一个如下所示的列表,
var list = new List<string>();
list.Add("12345");
list.Add("Words");
list.Add("Are");
list.Add("Here");
list.Add("13264");
list.Add("More");
list.Add("Words");
list.Add("15654");
list.Add("Extra");
list.Add("Words");
我希望能够从列表中删除所有以数字开头的字符串,并将它们之间的字符串连接起来,如下所示,
文字在这里
更多单词
额外的话
这个逻辑看起来怎么样?以下是我一直在尝试做的事情,但我无法首先了解如何删除带有数字的字符串,更不用说在删除带有数字的字符串时创建换行符了。
foreach (string s in list)
{
if (s.StartsWith("1"))
s.Remove(0, s.Length);
else
String.Concat(s);
}
foreach (string p in list)
Console.WriteLine(p);
您正在做的是对数据进行“分块”或“分页”,但是您需要逐一遍历每个源元素以确定页面的开始和停止位置。
public static IEnumerable<ICollection<T>> ChunkBy<T>(IEnumerable<T> source, Func<T, bool> predicate)
{
ICollection<T> currentChunk = new List<T>();
foreach (var item in source)
{
if (predicate(item))
{
if (currentChunk.Any())
{
yield return currentChunk;
currentChunk = new List<T>();
}
}
else
{
currentChunk.Add(item);
}
}
if (currentChunk.Any())
{
yield return currentChunk;
}
}
这是一个可重用的方法(你可以添加this
到第一个参数的开头,使其成为扩展方法),利用IE可枚举 https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerator-1?view=net-6.0#remarks and 屈服 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield结果。本质上,您返回一个值流,其中每个值都是一个集合。所以这是一个列表的列表,但术语更加流畅。
这是做什么的
- 从当前项目“页面”的空临时列表开始。
- 循环遍历源中的每个元素。
- For each element, decide if it's the start of a new page or not.
- 如果它是一个新块,则返回您为当前卡盘保存的内容,假设保存的块不为空。
- 如果不是新块,则将该条目添加到当前块中。
- 当您完成所有条目后,发送最后一个块,假设它不为空。
你可以这样调用这个方法:
var output = ChunkBy(list, x => char.IsNumber(x[0]))
.Select(ch => string.Join(" ", ch));
foreach (var o in output)
Console.WriteLine(o);
这使
Words Are Here
More Words
Extra Words
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)