C# while循环中有多个foreach循环
是否可以在任何循环结构(如while或for)中包含多个“foreach”语句。。。我想同时打开两个不同目录中的.wav文件,以便比较两个目录中的文件。 这是我想说的,但肯定是错的。。在此方面的任何帮助都将不胜感激C# while循环中有多个foreach循环,c#,C#,是否可以在任何循环结构(如while或for)中包含多个“foreach”语句。。。我想同时打开两个不同目录中的.wav文件,以便比较两个目录中的文件。 这是我想说的,但肯定是错的。。在此方面的任何帮助都将不胜感激 string[] fileEntries1 = Directory.GetFiles(folder1, "*.wav"); string[] fileEntries2 = Directory.GetFiles(folder11, "*.wav"); while ( foreach(s
string[] fileEntries1 = Directory.GetFiles(folder1, "*.wav");
string[] fileEntries2 = Directory.GetFiles(folder11, "*.wav");
while ( foreach(string fileName1 in fileEntries1) && foreach(string fileName2 in fileEntries2))
如果要分别迭代两个路径中的所有文件对,可以按如下操作
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
}
}
这就是我的建议,使用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
}
}
从图形上说不是。这是因为
foreach
构造是一个语句,而while
语句中的测试必须是表达式
最好的方法是嵌套foreach
块:
foreach(string fileName1 in fileEntries1)
{
foreach(string fileName2 in fileEntries2)
由于您只需要验证相同的文件名,因此类似于此:
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
}
}
IEnumerable fileEntries1=Directory.GetFiles(folder1,*.wav”)。选择(x=>Path.GetFileName(x));
IEnumerable fileEntries2=Directory.GetFiles(folder2,“*.wav”)。选择(x=>Path.GetFileName(x));
IEnumerable filesToIterate=(fileEntries1.Count()>fileEntries2.Count())?fileEntries1:fileEntries2;
IEnumerable filesToValidate=(fileEntries1.Count()
基于.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
}
}
List fileEntries1=新列表(Directory.GetFiles(folder1,*.wav));
List fileEntries2=新列表(Directory.GetFiles(folder2,*.wav));
列出filesToIterate=(fileEntries1.Count>fileEntries2.Count)?fileEntries1:fileEntries2;
filesToValidate=(fileEntries1.Count
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;
}
要验证的静态列表文件;
私有静态字符串FindFile(字符串fileToFind)
{
字符串returnValue=null;
foreach(filesToValidate中的字符串filePath)
{
if(string.Compare(Path.GetFileName(filePath),fileToFind,true)==0)
{
//找到文件了吗
returnValue=filePath;
打破
}
}
if(返回值!=null)
{
//在较小的列表中找到文件。请从列表中删除此文件,因为我们不需要再次查找它
filesToValidate.Remove(返回值);
}
返回值;
}
根据需要,您可以选择或不选择将字段和方法设置为静态。如果要“并行”启用这两个集合,请使用它们的迭代器,如下所示:
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;
}
如果一个集合比另一个集合短,则当较短的集合没有更多元素时,此循环将结束。我喜欢在一行中使用此类语句。所以,尽管这里的大多数答案都是正确的,我还是给你这个
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
}
那个额外的while循环是干什么的?对于每个循环嵌套如何?如果两个列表的长度不同怎么办?我不想循环所有可能的对。。我只想将folder1中的1.wav与folder11中的1.wav进行比较。。有没有办法做到这一点..如果两个文件夹都包含不同名称的文件,例如
folder1
包含一个不包含在folder11
中的文件,结果应该是什么?系统的命名空间中存在“where”和“contains”关键字。参数。NullException。。我认为.net2.0不支持这一点。你能提供一个在.Net2.0范围内工作的替代方案吗。。谢谢……:)除了公认的答案,我想我做不到。我的答案至少需要.NET3.5。即使在.NET2.0应用程序中包含LINQ
,我也不会尝试这样做。非常感谢。。这段代码运行正常。。但是我在这方面面临一个小问题。。这段代码使用了.NET2.0不支持的名称空间system.Linq(这是必需的),我甚至尝试为同一个名称空间编写配置文件。。。但它仍然不起作用。。是否有解决方案?@user3582072添加了基于.Net 2.0的解决方案。这不是最优雅的方式,但我相信这会奏效。