繁体   English   中英

C#遍历文件并重复进行,直到完成所有比较组合为止

[英]C# Loop through Files and Repeat Until Every Combination of Comparisons is Complete

我必须执行一项任务,我会尽力详细说明它。

我有5个文件夹,例如:

  • 文件夹A
  • 文件夹B
  • 资料夹C
  • 资料夹D
  • 文件夹E

在每个文件夹中都有一个文件。 基本上,我需要将每个文件相互比较(我将根据这些文件中的数据来计算一个值。)需要对每种组合(A到B,A到C,A到D,A到A)进行比较。 E,B到C,B到D,B到E,C到D,C到E,D到E)

不太确定从哪里开始。 任何帮助是极大的赞赏!

假设您已经有文件的FileInfo对象,则可以执行以下操作:

        List<FileInfo> files = new List<FileInfo>() {};
        foreach (FileInfo fileContentA in files)
        {
            foreach (FileInfo fileContentB in files.Where(
                     x.Name.CompareTo(fileContentA.Name) > 0))
            {
                Compare(fileContentA, fileContentB);
            }
        }
string[] folder = { "A", "B", "C", "D", "E" };

for (int i=0; i<folder.Length; ++i)
   for (int j=i+1; j<folder.Length; ++j)
      compareFolders(folder[i], folder[j]);

您可以创建扩展方法来封装此算法以用于任何数组:

public static class Alg
{
   public static void nonIdentityPermutations<T>(this T[] elements, Action<T, T> action)
   {
      for (int i=0; i<elements.Length; ++i)
         for (int j=i+1; j<elements.Length; ++j)
            action(elements[i], elements[j]);
   }
}

然后,您可以编写:

folder.nonIdentityPermutations( (a,b) => Console.WriteLine(a + " to " + b) );

要么:

folder.nonIdentityPermutations(compareFolders);

这样的事情应该工作

var folders = new string[] { "A", "B", "C", "D", "E" };

for (int i = 0; i < folders.Length; i++)
{
  for(int j = i+1; j < folders.Length; j++)
    Console.WriteLine(folders[i] + "=>" + folders[j]);
}

当然,我使用一个简单的string []进行演示,但我希望您能理解这个概念?

我建议开始比较A与B,A与C,A与D,A与E。然后继续B与(C至E),C与(D与E),然后再剩下一个是D到E。

怎么样:

var files = Directory.GetFiles(myDir, myExtension, SearchOption.AllDirectories)
                     .OrderBy(f => f)
                     .ToArray();

var comparisons = from file1 in files
                  from file2 in files
                  where StringComparer.Ordinal.Compare(file1, file2) < 0
                  select new {
                                file1, 
                                file2, 
                                Comparison = MyComparison(file1, file2)
                             };

本质上,这是用自身创建files的二进制笛卡尔积,然后以防止选择(A,B)和(B,A)的方式过滤元组。

显然,必须修改示例代码以满足您的确切要求。

嵌套循环可以轻松地完成技巧,以确保将每个文件与所有其他文件进行比较。 不确定c#语法,但是这应该给您基本概念:

for each (file:File in fileArray)
{
   for each (

编辑 :B! 我对这个网站太慢了。 任何以嵌套循环为例击败我的人都会获得+1。 = D

不确定返回的值是什么,但是这里有一个遍历五个文件夹并将值附加到单个字符串作为最终值的示例。
您可以在此基础上建立自己的逻辑。

string CompareMyFolders()
{
    string FinalValue = "";
    DirectoryInfo[] folders = new DirectoryInfo[5];
    folders[0] = new DirectoryInfo("C:\\FolderA\\");
    folders[1] = ...;
    folders[2] = ...;
    folders[3] = ...;
    folders[4] = ...;

    for(int i = 0; i < folders.Length - 1; i++)
        for(int j = i + 1; j < folders.Length; j++)
            FinalValue += CompareFolders(folders[i], folders[j]);

    return FinalValue;
}

string CompareFolders(DirectoryInfo folder1, DirectoryInfo folder2)
{
    string value = "";
    // compare the files in both directory
    // append the returning data to the value

    return value;
}

一种解决方案

#using system.io        

private void RecurseFiles()
{
    String[] files = Directory.GetFiles(@"c:\dev\", "*.tif", SearchOption.AllDirectories);

    for (int i = 0; i < files.Length; i++)
        for (int j = i+1; j < files.Length; j++)
             CompareFiles(files[i], files[j]);
}

如果比较文件夹以标识相互对应的文件,则需要处理3个键。 第一个键是文件名(或其他方法,用于标识来自不同目录的2个文件的对应关系)。 第二个密钥是目录(文件身份的一部分)。 第三个键是文件的内容(或内容的一部分,或属性,时间戳,哈希等)。

  • 收集所有文件身份作为键的三元组
  • 使用键1,2,3按此顺序在单个容器中对它们进行排序
  • 通过一次按单个key#1值获取文件身份的子集来遍历排序的容器。
  • 对于每个这样的子集,构建带有空对角线和一半空的正方形表,其中表的边是身份的关键2,3值
  • 沿任意方向遍历所得三角形以完全填充(相同形状的)结果表
  • 将结果表存储在某些最终容器中,或继续将结果推入输出
  • 重复下一个子集,直到没有更多子集为止
  • 做完了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM