Hi All,
I have the following little class of iterators that allow me to iterate over
elements in the file system. I have nested some of them, and then added Func<FileInfo,
booldelegates to filter out unwanted files. I get an InvalidProgramException
and haven't (yet) been able to find out what's going on. Do you have any
ideas?
TIA
Andrew Matthews
========================================
public class FsIter
{
public static IEnumerable<DirectoryInfoSubDirectories(DirectoryI nfo
di)
{
yield return di;
foreach (DirectoryInfo directory in di.GetDirectories())
{
foreach (DirectoryInfo subDirectory in SubDirectories(directory))
{
yield return subDirectory;
}
}
}
public static IEnumerable<FileInfoAllFilesUnder(DirectoryInfo d)
{
foreach (DirectoryInfo dir in SubDirectories(d))
{
foreach (FileInfo fileInfo in dir.GetFiles())
{
yield return fileInfo;
}
}
}
public static IEnumerable<FileInfoMatchingFilesUnder(Func<FileIn fo,
boolx, DirectoryInfo d)
{
foreach (FileInfo fileInfo in AllFilesUnder(d))
{
if (x(fileInfo))
yield return fileInfo;
}
}
public static IEnumerable<FileInfoFilesByExtension(string ext,
DirectoryInfo d)
{
Func<FileInfo, booltest = x=>x.Extension==ext;
return Match(test, AllFilesUnder(d));
}
public static IEnumerable<ITMatch<IT>(Func<IT, booltest, IEnumerable<IT>
col)
{
foreach (IT it in col)
{
if(test(it))
yield return (it);
}
}
}
I tried to exercise it with the following:
[Test]public void TestIterateTestDir2()
{
string testdir = @"C:\etc\dev\fstags\src\UnitTests\tests";
List<FileInfofiles = new List<FileInfo>(FsTags.Core.FsIter.FilesByExtension (".txt",
new DirectoryInfo(testdir)));
Assert.AreEqual(files.Count, 4);
}
And I got the following:
System.InvalidProgramException: Common Language Runtime detected an invalid
program.
at FsTags.Core.FsIter.FilesByExtension(String ext, DirectoryInfo d)
at fstags.UnitTests.TestFsIter.TestIterateTestDir2() in TestFsIter.cs:line
26
I am running C# 3.0 May CTP (LINQ preview) and ReSharper 2.0 (2005)