如果此代码段,我该如何改善性能。
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循环?
答案 0 :(得分:5)
听起来像:
if (AndSets.Contains("0"))
{
OrSetFinalResult = false;
}
根本不需要LINQ。它当然还会在内部循环,但它仍然要简单得多。
编辑:如评论中所述,您还可以使用:
OrSetFinalResult = OrSetFinalResult && !OrSet.Split('&').Contains("0");
答案 1 :(得分:2)
您没有包含OrSetFinalResult
的定义,所以我能想到的最快的是:
OrSetFinalResult = OrSetFinalResult && !OrSet.Split('&').Contains("0");
因为如果它已经是假的,那么就会跳过整个事情。
更一般地说,您可以使用任何搜索做的最好的事情是:
有中间病例。例如。如果我想从一组仅在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;
}
这会给你相同的结果。