替换字符串.与其他结构分离-优化

本文关键字:分离 优化 结构 其他 字符串 替换 | 更新日期: 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,我建议使用StringTokenizerStreamTokenizer类。很遗憾。net中没有类似的类