2014-12-31 260 views
2

是否有可能在任何循环结构中包含多个“foreach”语句,如while或for ...我想同时打开两个不同目录中的.wav文件,以便我可以比较来自两者的文件。 这里是我想这样做,但它肯定是错误的..在这方面的任何帮助表示赞赏。while循环中的多个foreach循环

string[] fileEntries1 = Directory.GetFiles(folder1, "*.wav"); 
string[] fileEntries2 = Directory.GetFiles(folder11, "*.wav"); 
while (foreach(string fileName1 in fileEntries1) && foreach(string fileName2 in fileEntries2)) 
+1

什么是额外的while循环?每个循环嵌套呢? –

+0

如果两个列表的长度不同,该怎么办? –

回答

0

像这样的事情,因为你只需要验证相同的文件名:

IEnumerable<string> fileEntries1 = Directory.GetFiles(folder1, "*.wav").Select(x => Path.GetFileName(x)); 
IEnumerable<string> fileEntries2 = Directory.GetFiles(folder2, "*.wav").Select(x => Path.GetFileName(x)); 

IEnumerable<string> filesToIterate = (fileEntries1.Count() > fileEntries2.Count()) ? fileEntries1 : fileEntries2; 
IEnumerable<string> filesToValidate = (fileEntries1.Count() < fileEntries2.Count()) ? fileEntries1 : fileEntries2; 

// Iterate the bigger collection 
foreach (string fileName in filesToIterate) 
{ 
    // Find the files in smaller collection 
    if (filesToValidate.Contains(fileName)) 
    { 
     // Get actual file and compare 
    } 
    else 
    { 
     // File does not exist in another list. Handle appropriately 
    } 
} 

NET 2.0基础的解决方案:

List<string> fileEntries1 = new List<string>(Directory.GetFiles(folder1, "*.wav")); 

List<string> fileEntries2 = new List<string>(Directory.GetFiles(folder2, "*.wav")); 

List<string> filesToIterate = (fileEntries1.Count > fileEntries2.Count) ? fileEntries1 : fileEntries2; 
filesToValidate = (fileEntries1.Count < fileEntries2.Count) ? fileEntries1 : fileEntries2; 

string iteratorFileName; 
string validatorFilePath; 

// Iterate the bigger collection 
foreach (string fileName in filesToIterate) 
{ 
    iteratorFileName = Path.GetFileName(fileName); 

    // Find the files in smaller collection 
    if ((validatorFilePath = FindFile(iteratorFileName)) != null) 
    { 
     // Compare fileName and validatorFilePath files here 
    } 
    else 
    { 
     // File does not exist in another list. Handle appropriately 
    } 
} 

FindFile方法:

static List<string> filesToValidate; 

private static string FindFile(string fileToFind) 
{ 
    string returnValue = null; 

    foreach (string filePath in filesToValidate) 
    { 
     if (string.Compare(Path.GetFileName(filePath), fileToFind, true) == 0) 
     { 
      // Found the file 
      returnValue = filePath; 
      break; 
     } 
    } 

    if (returnValue != null) 
    { 
     // File was found in smaller list. Remove this file from the list since we do not need to look for it again 
     filesToValidate.Remove(returnValue);  
    } 

    return returnValue;  
} 

根据您的需要,您可能会也可能不会选择静态字段和方法。

+0

谢谢吨..此代码工作正常..但我面临一个小问题关于此..此代码使用名称空间system.Linq哪不支持.NET 2.0(这是要求),我甚至尝试写一个配置文件的相同...仍然没有工作..有没有解决这个..? – user3582072

+0

@ user3582072添加了基于.Net 2.0的解决方案。不是最优雅的方式来做到这一点,但我相信这会起作用。 – danish

0

如果要分别在两个路径中迭代所有文件对,可以按如下所示进行操作。

string[] fileEntries1 = Directory.GetFiles(folder1, "*.wav"); 
string[] fileEntries2 = Directory.GetFiles(folder11, "*.wav"); 

foreach(string fileName1 in fileEntries1) 
{ 
    foreach(string fileName2 in fileEntries2) 
    { 
     // to the actual comparison 
    } 
} 
+0

我不想循环所有可能的对..我只是想比较1.wav从folder1到1.wav的folder11 ..有没有办法做到这一点.. – user3582072

+0

如果两个都应该是结果文件夹包含不同名称的文件,例如'folder1'包含'folder11'中没有的文件? – Codor

+0

让我们假设这两个文件夹包含具有相同名称的文件.. – user3582072

0

这是我的建议,使用LINQ

using System.Linq; 

var fileEntries1 = Directory.GetFiles(folder1, "*.wav"); 
var fileEntries2 = Directory.GetFiles(folder11, "*.wav"); 
foreach (var entry1 in fileEntries1) 
{ 
    var entries = fileEntries2.Where(x => Equals(entry1, x)); 
    if (entries.Any()) 
    { 
     //We have matches 
     //entries is a list of matches in fileentries2 for entry1 
    } 
} 
2

Gramatically说没有。这是因为foreach构造是陈述while陈述中的测试必须是表达式

你最好的赌注是嵌套foreach块:

foreach(string fileName1 in fileEntries1) 
{ 
    foreach(string fileName2 in fileEntries2) 
0

如果要启用“并联”两个集合,然后用自己的迭代器是这样的:

var fileEntriesIterator1 = Directory.EnumerateFiles(folder1, "*.wav").GetEnumerator(); 
var fileEntriesIterator2 = Directory.EnumerateFiles(folder11, "*.wav").GetEnumerator(); 

while(fileEntriesIterator1.MoveNext() && fileEntriesIterator2.MoveNext()) 
{ 
    var file1 = fileEntriesIterator1.Current; 
    var file2 = fileEntriesIterator2.Current; 
} 

如果一个集合是比其他较短,这种循环会更短的收集有没有更多的时候结束元素。

1

我喜欢这种类型的陈述在一行中。所以即使这里的大部分答案都是正确的,我也会给你这个答案。

string[] fileEntries1 = Directory.GetFiles(folder1, "*.wav"); 
string[] fileEntries2 = Directory.GetFiles(folder11, "*.wav"); 

foreach(var fileExistsInBoth in fileEntries1.Where(fe1 => fileEntries2.Contains(fe1)) 
{ 
    /// here you will have the records which exists in both of the lists 
} 
+0

“where”和“contains”关键字存在于system.arguments.nullexceptions的命名空间中,这不受.net2支持。0我想。你可以提供一个在.Net2.0的边界内工作的替代方案..谢谢.. :) – user3582072

+0

我不认为我可以,除了接受的答案。我的答案至少需要.net 3.5。即使在.net 2.0应用程序中包含'LINQ'的解决方法和窍门,我也不会这么做。 –