Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# while循环中有多个foreach循环_C# - Fatal编程技术网

C# while循环中有多个foreach循环

C# while循环中有多个foreach循环,c#,C#,是否可以在任何循环结构(如while或for)中包含多个“foreach”语句。。。我想同时打开两个不同目录中的.wav文件,以便比较两个目录中的文件。 这是我想说的,但肯定是错的。。在此方面的任何帮助都将不胜感激 string[] fileEntries1 = Directory.GetFiles(folder1, "*.wav"); string[] fileEntries2 = Directory.GetFiles(folder11, "*.wav"); while ( foreach(s

是否可以在任何循环结构(如while或for)中包含多个“foreach”语句。。。我想同时打开两个不同目录中的.wav文件,以便比较两个目录中的文件。 这是我想说的,但肯定是错的。。在此方面的任何帮助都将不胜感激

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的解决方案。这不是最优雅的方式,但我相信这会奏效。