如何使这个代码更优化 - 如何替换for循环。

时间:2011-12-09 14:30:54

标签: c# linq optimization

如果此代码段,我该如何改善性能。

bool OrSetFinalResult =true;
string OrSet = "(1&1)|0";
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;
    }
}

有没有办法用任何LINQ表达式删除ForEach循环?

6 个答案:

答案 0 :(得分:5)

听起来像:

if (AndSets.Contains("0"))
{
    OrSetFinalResult = false;
}

根本不需要LINQ。它当然还会在内部循环,但它仍然要简单得多。

编辑:如评论中所述,您还可以使用:

OrSetFinalResult = OrSetFinalResult && !OrSet.Split('&').Contains("0");

答案 1 :(得分:2)

您没有包含OrSetFinalResult的定义,所以我能想到的最快的是:

OrSetFinalResult = OrSetFinalResult && !OrSet.Split('&').Contains("0");

因为如果它已经是假的,那么就会跳过整个事情。

更一般地说,您可以使用任何搜索做的最好的事情是:

  1. 如果根据您要搜索的功能(在这种情况下,在字符串本身上)对集合进行哈希处理,则为O(1)。
  2. 如果根据您要搜索的功能对集合进行排序,则为O(log n)。
  3. 如果未对集合进行排序,则为O(n)。
  4. 有中间病例。例如。如果我想从一组仅在X坐标上排序的坐标中找到一个特定的X-Y坐标,则假设分布合理均为O(√nlog√n)。

    在这种情况下,我们有O(n)的情况。

    将值放入HashSet<string>会使此搜索O(1),但这样做本身就是一个O(n)操作(并且具有更高的常量效果)。因此,如果您要多次搜索,这将是一种节省,但如果您只搜索一次则不会。

答案 2 :(得分:1)

您可以使用Linq中的Any运算符。

string OrSet = "(1&1)|0";
string[] AndSets = OrSet.Split('&');
OrSetFinalResult = !AndSets.Any(x => x == "0");

答案 3 :(得分:0)

你可以在linq中使用any运算符来产生类似的结果。

答案 4 :(得分:0)

在大多数情况下,用LINQ替换字符串解析与优化相反(假设您的意思是运行时优化)。

我猜测线性标记器会快得多。也许我会做一个样本基准(如果我找时间)

答案 5 :(得分:0)

string OrSet = "(1&1)|0";
bool OrSetFinalResult = true;
    if (OrSet.Contains("0"))
    {
        // A single "false" statement makes the entire And statement FALSE
        OrSetFinalResult = false;

    }

这会给你相同的结果。

相关问题