Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# Compact框架是否提供可选参数?_C#_Recursion_Compact Framework_Optional Parameters_Getdirectories - Fatal编程技术网

C# Compact框架是否提供可选参数?

C# Compact框架是否提供可选参数?,c#,recursion,compact-framework,optional-parameters,getdirectories,C#,Recursion,Compact Framework,Optional Parameters,Getdirectories,我需要获取手持设备上所有文件的列表,这些文件的名称符合某种模式,例如“ABC.XML” 我根据(Hernaldo的答案)改编了代码,如下所示: public static List<string> GetXMLFiles(string fileType, string dir) { string dirName = dir; // call it like so: GetXMLFiles("ABC", "\\"); <= I think the double-whac

我需要获取手持设备上所有文件的列表,这些文件的名称符合某种模式,例如“ABC.XML”

我根据(Hernaldo的答案)改编了代码,如下所示:

public static List<string> GetXMLFiles(string fileType, string dir)
{
    string dirName = dir; // call it like so: GetXMLFiles("ABC", "\\");  <= I think the double-whack is what I need for Windows CE device...am I right?
    var fileNames = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(dirName))
        {
            if ((f.Contains(fileType)) &&  (f.Contains(".XML")))
            {
                fileNames.Add(f);
            }
        }
        foreach (string d in Directory.GetDirectories(dirName))
        {
            GetXMLFiles(fileType, d);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return fileNames;
}
是吗

更新2 下面是我对艾伦评论的第二个回应:

const string EXTENSION = ".XML";
. . .
try
{
    foreach (string f in Directory.GetFiles(dirName))
    {
        string ext = Path.GetExtension(f);
        string fileNameOnly = Path.GetFileNameWithoutExtension(f);
        if ((ext.Equals(EXTENSION, StringComparison.Ordinal)) && (fileNameOnly.Contains(fileType)))
        {
            fileNames.Add(f);
        }
    }
    foreach (string d in Directory.GetDirectories(dirName))
    {
        GetXMLFiles(fileType, d);
    }
}
具有采用搜索模式的重载,您可以使用:

Directory.GetFiles(dirName, "ABC.XML")

您还可以使用通配符,如
“*.XML”
,它将返回所有XML文件

可选参数是.NET 4.0的一项功能,因此您将无法使用它们。使用递归函数的典型解决方案是使用不同的参数为方法创建两个重载

比如说,

BinarySearch(array a);
{
  BinarySearch(a, -1, array.Length);
} 

BinarySearch(array, low, high)
{
   //code to update low high
   return BinarySearch(array, low, high);
}

在本例中,启动递归的方法具有稍微不同的签名。你也可以这样做。

无论如何,这是一个很好的信息(谢谢!),但它没有回答问题。@B.ClayShannon,我完全误解了这个问题,你在用方法寻找默认参数,它们在C#4.0中可用。您可以创建多个重载方法,一个带参数,另一个不带参数。。我将研究如何使用defined Path.GetExtension方法获取扩展,并使用StringComparison.OrdinalingOreCase将其与.xml进行比较。然后还有Path.GetFilenameWithoutExtension来搜索文件的另一部分以查找ABC(或类似的,取决于您的要求)CompactFramework子集是否都有这些精细功能?那么您是说我的Update2比Update(1)更好,还是说应该如何实现,为什么更好?它更好,但是这个方法看起来仍然需要改进。我没有看到你从GetXMLFiles返回任何文件名?此外,假设希望它不区分大小写,则需要OrdinalIgnoreCase而不是Ordinal。使用内置路径方法比您自己的方法更不容易出错。如果文件名是SomeShadyFile.XML.exe怎么办?这很有趣,但是您是否将返回的文件名添加到上一个递归调用的列表中?(它不在里面)。您可能还需要考虑使用yield-return语句返回IEnumerable(这样可以避免将该列表保留在一起)
Directory.GetFiles(dirName, "ABC.XML")
BinarySearch(array a);
{
  BinarySearch(a, -1, array.Length);
} 

BinarySearch(array, low, high)
{
   //code to update low high
   return BinarySearch(array, low, high);
}