替换字符串.与其他结构分离-优化
本文关键字:分离 优化 结构 其他 字符串 替换 | 更新日期: 2023-09-27 18:17:41
这里我使用Split
函数来获取字符串的部分。
string[] OrSets = SubLogic.Split('|');
foreach (string OrSet in OrSets)
{
bool OrSetFinalResult = false;
if (OrSet.Contains('&'))
{
OrSetFinalResult = true;
if (OrSet.Contains('0'))
{
OrSetFinalResult = false;
}
//string[] AndSets = OrSet.Split('&');
//foreach (string AndSet in AndSets)
//{
// if (AndSet == "0")
// {
// // A single "false" statement makes the entire And statement FALSE
// OrSetFinalResult = false;
// break;
// }
//}
}
else
{
if (OrSet == "1")
{
OrSetFinalResult = true;
}
}
if (OrSetFinalResult)
{
// A single "true" statement makes the entire OR statement TRUE
FinalResult = true;
break;
}
}
如何替换Split
操作,以及替换foreach
结构
假设1
根据您的流程类型,您可以并行化工作:
var OrSets = SubLogic.Split('|').AsParallel();
foreach (string OrSet in OrSets)
{
...
....
}
然而,这通常会导致多线程应用的问题(锁定资源等)。你还必须衡量收益。从一个线程切换到另一个线程可能代价高昂。如果作业很小,AsParallel将比简单的顺序循环慢。
当网络资源或任何类型的I/o有延迟时,这是非常有效的。
假说# 2
你的SubLogic变量非常非常非常大
在本例中,您可以按顺序遍历文件:
class Program
{
static void Main(string[] args)
{
var SubLogic = "darere|gfgfgg|gfgfg";
using (var sr = new StringReader(SubLogic))
{
var str = string.Empty;
int charValue;
do
{
charValue = sr.Read();
var c = (char)charValue;
if (c == '|' || (charValue == -1 && str.Length > 0))
{
Process(str);
str = string.Empty; // Reset the string
}
else
{
str += c;
}
} while (charValue >= 0);
}
Console.ReadLine();
}
private static void Process(string str)
{
// Your actual Job
Console.WriteLine(str);
}
此外,根据|
之间每个块的长度,您可能希望使用StringBuilder而不是简单的字符串连接。
如果您需要优化以提高应用程序的性能,那么需要优化的是foreach循环中的代码,而不是字符串。分割方法。
(编辑:)在StackOverflow上有许多关于优化字符串解析的好答案:
- 解析大字符串的最快方法(多线程)c#中的快速字符串解析
string . split()可能比您自己能够以一种良好优化的方式实际拆分字符串做得更多。当然,前提是您希望对输入的每个分割部分返回真或假。否则,您可以专注于搜索您的字符串。
正如其他人所提到的,如果你需要搜索一个巨大的字符串(数百兆字节),特别是需要重复和连续地这样做,那么看看。net 4为你提供的任务并行库。
对于搜索字符串,您可以查看MSDN上的这个示例,了解如何使用IndexOf, LastIndexOf, StartsWith和EndsWith方法。这些应该比Contains方法执行得更好。
当然,最好的解决方案取决于你的具体情况。您将需要使用System.Diagnostics.Stopwatch类来查看您的实现(当前的和新的)花费的时间,以查看哪种实现效果最好。您可以使用StringBuilder
来处理它。尝试从源字符串逐字符读取StringBuilder
,直到找到'|',然后处理StringBuilder
包含的内容。这是避免创建大量String
对象并节省大量内存的方法。
如果你要使用Java,我建议使用StringTokenizer
和StreamTokenizer
类。很遗憾。net中没有类似的类