C# C语言的代表#

C# C语言的代表#,c#,delegates,C#,Delegates,我有3个文件需要与100个其他文件进行比较(通过使用我编写的一些函数)。 我从三个文件中取出每个文件,并在循环中将它们与100个文件中的每个文件进行比较。 我想按顺序使用函数,在我将3个文件与我想激活下一个函数的100个文件进行比较后,我该如何操作(函数的签名相同,因此我可以使用委托,但我不知道如何操作) 下面是用于比较的伪代码: for(i=0;i<3;i++) { for(j=0;j<100;j++) compare(filesArr1[i],filesArr2[j]);

我有3个文件需要与100个其他文件进行比较(通过使用我编写的一些函数)。 我从三个文件中取出每个文件,并在循环中将它们与100个文件中的每个文件进行比较。 我想按顺序使用函数,在我将3个文件与我想激活下一个函数的100个文件进行比较后,我该如何操作(函数的签名相同,因此我可以使用委托,但我不知道如何操作) 下面是用于比较的伪代码:

for(i=0;i<3;i++)
{
 for(j=0;j<100;j++)
   compare(filesArr1[i],filesArr2[j]);
}

对于(i=0;i首先,如果主循环和唯一循环将遍历100个文件,并在其中比较3个文件,则速度会快得多;)如下所示:

for( int index = 0; index < 100; index++ )
{
  // then all actions here
}
for(int-index=0;index<100;index++)
{
//那么这里的所有行动
}

下一个。如果在某些步骤后需要切换到另一个比较函数,则需要将工作代理更改为切换到其他函数。但在切换委托还是调用另一个函数上并没有区别,在您的情况下,您只需要为第三个文件调用另一个函数。您需要更好地形式化为什么需要切换以及切换所依赖的前提。

首先,如果主循环和唯一循环将遍历100个文件,并在其中比较3个文件,则速度会快得多;)像这样:

for( int index = 0; index < 100; index++ )
{
  // then all actions here
}
for(int-index=0;index<100;index++)
{
//那么这里的所有行动
}

下一个。如果在某些步骤后需要切换到另一个比较函数,则需要将工作代理更改为切换到其他函数。但在切换委托还是调用另一个函数上并没有区别,在您的情况下,您只需要为第三个文件调用另一个函数。您需要更好地形式化为什么需要切换以及切换所依赖的前提。

好的,因此基本上您正在尝试通过比较来参数化一个常用方法。像这样的东西应该适合你:

public void CompareFiles(IEnumerable<string> firstFiles,
                         IEnumerable<string> secondFiles,
                         Action<string, string> comparison)
{
    foreach (string file1 in firstFiles)
    {
        foreach (string file2 in secondFiles)
        {
            comparison(file1, file2);
        }
    }
}

这是假设比较方法已经采取了任何适当的操作。如果它需要返回某个内容,您可能需要使用某种描述的
Func
,更多详细信息将非常有用。

好的,因此基本上您正在尝试通过比较来参数化一个常用方法。像这样的东西应该适合你:

public void CompareFiles(IEnumerable<string> firstFiles,
                         IEnumerable<string> secondFiles,
                         Action<string, string> comparison)
{
    foreach (string file1 in firstFiles)
    {
        foreach (string file2 in secondFiles)
        {
            comparison(file1, file2);
        }
    }
}

这是假设比较方法已经采取了任何适当的操作。如果需要返回某些内容,您可能需要使用某种描述的
Func
,更多详细信息将非常有用。

如果您知道要更改比较函数的迭代次数,您可以执行基本的If(或switch),无需委托:

  if ( 0 < j ) && ( j < 2)
      compare1()
  else
  if (2 < j) && ( j < 10)
     compare2()
  else
     compare3()
if(0
如果您知道要更改比较函数的迭代次数,可以执行基本的If(或switch),无需委托:

  if ( 0 < j ) && ( j < 2)
      compare1()
  else
  if (2 < j) && ( j < 10)
     compare2()
  else
     compare3()
if(0
以下代码将运行您提供的循环两次;第一次调用comp1,第二次调用comp2。您可以通过以下方式增加比较函数的数量:a)写入更多,b)将其名称添加到下一行:

ComparisonDelegate[]比较=新建 ComparisonDelegate[]{comp1,comp2}

delegate bool ComparisonDelegate(字符串文件1,字符串文件2);
静态bool comp1(字符串文件1,字符串文件2){return true;}
静态bool comp2(字符串文件1,字符串文件2){return false;}
ComparisonDelegate[]比较=新的ComparisonDelegate[]{comp1,comp2};
void runcomparations()
{
foreach(比较中的比较与删除cd)
{
对于(int i=0;i<3;i++)
{
对于(int j=0;j<100;j++)
{
bool-retVal=cd(filesArr1[i],filesArr2[j]);
}
}
}
}

希望您可以调整它以适应

以下代码将运行您提供的循环两次;第一次调用comp1,第二次调用comp2。您可以通过以下方式增加比较函数的数量:a)写入更多,b)将其名称添加到下一行:

ComparisonDelegate[]比较=新建 ComparisonDelegate[]{comp1,comp2}

delegate bool ComparisonDelegate(字符串文件1,字符串文件2);
静态bool comp1(字符串文件1,字符串文件2){return true;}
静态bool comp2(字符串文件1,字符串文件2){return false;}
ComparisonDelegate[]比较=新的ComparisonDelegate[]{comp1,comp2};
void runcomparations()
{
foreach(比较中的比较与删除cd)
{
对于(int i=0;i<3;i++)
{
对于(int j=0;j<100;j++)
{
bool-retVal=cd(filesArr1[i],filesArr2[j]);
}
}
}
}

希望你能把这句话改编成适合你的

你能更详细地解释一下你的第一句话吗?这一点都不清楚-特别是因为有两个循环。。。据我所知,OP希望通过一次比较将三个文件中的每个文件与100个文件中的每个文件进行比较,然后使用不同的比较函数再次执行整个操作。@Jon在我的回答中添加了代码示例。我提议改变态度,首先将任务正式化。循环顺序与性能POV可能没有太大区别,但有一件事实际上很清楚:OP可以只为第三个文件调用一个函数,而为前两个文件使用另一个函数,所有代码都已清除,只有一个循环。是的,他可以使用公共函数提供两个不同的委托作为比较提供者。据我所知,他说的不是有一个外循环,而是在100循环内按程序进行所有三个比较(“然后这里的所有操作”)。它只消除了th的what、3增量和比较操作