0

在这里,我使用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构造。

4

3 回答 3

1

如果您需要优化以提高应用程序的性能,则可能需要优化foreach 循环的代码,而不是 string.Split 方法。

[编辑:]

StackOverflow 上的其他地方有许多与优化字符串解析相关的好答案:

String.Split() 可能比你自己做的更多,以一种优化的方式实际拆分字符串。当然,这假设您对为输入的每个拆分部分返回 true 或 false 感兴趣。否则,您可以只专注于搜索您的字符串。

正如其他人所提到的,如果您需要搜索一个巨大的字符串(数百兆字节),尤其是反复连续搜索,那么请查看 .NET 4 为您提供的任务并行库

对于字符串搜索,您可以查看 MSDN 上的这个示例,了解如何使用 IndexOf、LastIndexOf、StartsWith 和 EndsWith 方法。那些应该比 Contains 方法执行得更好。

当然,最佳解决方案取决于您的具体情况。您将需要使用System.Diagnostics.Stopwatch 类来查看您的实现(当前的和新的)需要多长时间才能看到最有效的方法。

于 2011-12-14T05:22:31.827 回答
1

假设 #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 而不是简单的字符串连接。

于 2011-12-14T05:31:11.770 回答
0

您可以使用StringBuilder. 尝试从源字符串中逐个字符地读入StringBuilder,直到找到“|”,然后处理 aStringBuilder包含的内容。这就是避免创建String大量对象并节省大量内存的方法。

如果您使用过 Java,我建议您使用StringTokenizerStreamTokenizer类。可惜.NET 中没有类似的类

于 2011-12-14T05:35:54.763 回答