gpt4 book ai didi

c# - C#中有没有懒惰的 `String.Split`

转载 作者:可可西里 更新时间:2023-11-01 08:09:06 25 4
gpt4 key购买 nike

全部 string.Split 方法似乎返回一个字符串数组 ( string[] )。

我想知道是否有一个返回 IEnumerable<string> 的惰性变体这样一个用于大字符串(或无限长度 IEnumerable<char> ),当只对第一个子序列感兴趣时,可以节省计算量和内存。如果字符串是由设备/程序(网络、终端、管道)构建的,并且整个字符串因此不需要立即完全可用,那么它也可能很有用。这样就可以处理第一次出现的情况。

.NET framework中有这样的方法吗?

最佳答案

你可以很容易地写一个:

public static class StringExtensions
{
public static IEnumerable<string> Split(this string toSplit, params char[] splits)
{
if (string.IsNullOrEmpty(toSplit))
yield break;

StringBuilder sb = new StringBuilder();

foreach (var c in toSplit)
{
if (splits.Contains(c))
{
yield return sb.ToString();
sb.Clear();
}
else
{
sb.Append(c);
}
}

if (sb.Length > 0)
yield return sb.ToString();
}
}

很明显,我没有测试它与 string.split 的奇偶校验,但我相信它的工作原理应该差不多。

正如 Servy 所说,这不会在字符串上拆分。这不是那么简单,也不是那么高效,但它基本上是相同的模式。

public static IEnumerable<string> Split(this string toSplit, string[] separators)
{
if (string.IsNullOrEmpty(toSplit))
yield break;

StringBuilder sb = new StringBuilder();
foreach (var c in toSplit)
{
var s = sb.ToString();
var sep = separators.FirstOrDefault(i => s.Contains(i));
if (sep != null)
{
yield return s.Replace(sep, string.Empty);
sb.Clear();
}
else
{
sb.Append(c);
}
}

if (sb.Length > 0)
yield return sb.ToString();
}

关于c# - C#中有没有懒惰的 `String.Split`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28178519/

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