C#中foreach()的复杂性。网

C#中foreach()的复杂性。网,c#,.net,c,time-complexity,asymptotic-complexity,C#,.net,C,Time Complexity,Asymptotic Complexity,朋友们,我在用C。NET中,我需要从一个文件中读取800万行并在其上进行计算。当我在C语言中执行相同的操作时,需要花费时间,但不会太多,而在C语言中,在我下面提到的循环中,时间复杂度非常高。foreach()是否具有很高的复杂性?两者之间的差异可能是什么原因 foreach(string currLine in file.lines) { Tuple tpl = new Tuple(currLine,file.keyLength); Console.WriteLine(file.

朋友们,我在用C。NET中,我需要从一个文件中读取800万行并在其上进行计算。当我在C语言中执行相同的操作时,需要花费时间,但不会太多,而在C语言中,在我下面提到的循环中,时间复杂度非常高。foreach()是否具有很高的复杂性?两者之间的差异可能是什么原因

foreach(string currLine in file.lines)
{
    Tuple tpl = new Tuple(currLine,file.keyLength);
    Console.WriteLine(file.lines.IndexOf(currLine));

    if(tpl.isWeakKey(B)==true)
    {
        int nextKey=tpl.findNextKey(B);

        if (differentKeys.ContainsKey(nextKey))
        {
            differentKeys[nextKey] = differentKeys[nextKey]+1;
        }
        else
        {
            differentKeys[nextKey] = 1;
        }
    }
}

在循环中调用
IndexOf
方法以获取当前索引。该方法具有O(n)复杂度,这意味着整个循环是O(n²)复杂度

如果您只是使用一个索引,并手动增加它,您将得到更类似于C代码的东西

另一种更像C#ish(在我看来)的方法是使用LINQ为您提供索引:

foreach(string currLine in file.lines.Select((Text, Index) => new { Text, Index)))
{
    Tuple tpl = new Tuple(currLine.Text,file.keyLength);
    Console.WriteLine(currLine.Index);

    // ** No need to compare with boolean. if, already expect a boolean.
    if(tpl.isWeakKey(B))
    {
        int nextKey=tpl.findNextKey(B);

        if (differentKeys.ContainsKey(nextKey))
        {
            differentKeys[nextKey] = differentKeys[nextKey]+1;
        }
        else
        {
            differentKeys[nextKey] = 1;
        }
    }
}

确切地说,
文件.lines
是什么?请记住,您是在这个循环中编写控制台的—我认为这比
foreach
部分要昂贵得多。(您在其中也使用了
IndexOf
,在每次迭代中都是O(n))您是否尝试过完全删除
Console.WriteLine
语句?您真的在向控制台写入8Mio行吗?我猜
Console.WriteLine
用于800万行是瓶颈。您可以使用来读取视图中的大型文件。还可以尝试将if(differentKeys.ContainsKey(nextKey))替换为differentKeys.TryGetValue()。是否有可能看到C版本,以查看它们是否等效?用一种语言编写好的代码并将其移植到另一种语言的非常差的代码是非常容易的。也就是说,到目前为止人们所说的大部分内容都应该为您带来一些性能改进。