[英]C# Loop through Files and Repeat Until Every Combination of Comparisons is Complete
我必须执行一项任务,我会尽力详细说明它。
我有5个文件夹,例如:
在每个文件夹中都有一个文件。 基本上,我需要将每个文件相互比较(我将根据这些文件中的数据来计算一个值。)需要对每种组合(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个文件的对应关系)。 第二个密钥是目录(文件身份的一部分)。 第三个键是文件的内容(或内容的一部分,或属性,时间戳,哈希等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.