2014-12-31 258 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'的解決方法和竅門,我也不會這麼做。 –