Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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# 是否按特定顺序对文件夹中的文件进行迭代?_C#_Loops - Fatal编程技术网

C# 是否按特定顺序对文件夹中的文件进行迭代?

C# 是否按特定顺序对文件夹中的文件进行迭代?,c#,loops,C#,Loops,我对c编程非常陌生,所以如果我的问题很琐碎,我道歉。 我正在运行一些c代码,需要迭代文件夹中的一些文件,并使用: foreach (string f in Directory.GetFiles(@"C:\temp\GeneralStats")) { 但是,我希望这些文件按照文件名的特定顺序读取。我的文件名的格式如下 generalstats_2012_11_1.csv generalstats_2012_11_2.csv generalstats_2012_11_3.csv ..... 当我的

我对c编程非常陌生,所以如果我的问题很琐碎,我道歉。 我正在运行一些c代码,需要迭代文件夹中的一些文件,并使用:

foreach (string f in Directory.GetFiles(@"C:\temp\GeneralStats"))
{
但是,我希望这些文件按照文件名的特定顺序读取。我的文件名的格式如下

generalstats_2012_11_1.csv generalstats_2012_11_2.csv generalstats_2012_11_3.csv ..... 当我的代码读取文件时,它以generalstats_2012_11_1.csv开始,然后直接跳到generalstats_2012_11_10.csv,而不是generalstats_2012_11_2.csv

我试着在网上搜索答案,但没有找到任何答案。当然,我是根据特定文件夹中名称中的日期来订购文件的,但代码根本不承认这一点。 有人能帮我吗?c中是否有我遗漏的订单函数?

您可以使用以下命令:

        var paths = Directory.GetFiles(@"C:\temp\GeneralStats")
            .OrderBy(path => 
                Convert.ToInt32(path.Split('_', '.')[1]) * 10000 + 
                Convert.ToInt32(path.Split('_', '.')[2]) * 100 + 
                Convert.ToInt32(path.Split('_', '.')[3]));

        foreach (string path in paths)
        {
        }
这将从文件名中获取日期部分,并从中创建一个整数,例如,文件名中的2012_11_10为2012110为整数,2012_11_1为20121101等。这些数字用于排序

上述方法的另一个变化是:

        var paths = Directory.GetFiles(@"C:\temp\GeneralStats")
            .OrderBy(path =>
                Convert.ToInt32(
                    String.Concat(
                        path.Split('_', '.')
                            .Skip(1)
                            .Take(3)
                            .Select(num => num.PadLeft(2, '0'))
                            .ToArray())
                )
            );
它还解析文件名中的数字,并创建用于排序的整数


您可以使用Directory.GetFiles方法来代替Directory.GetFiles方法,但这仅在.NET 4及更高版本中可用。

如果要按文件名后面的日期排序,则必须将其强制转换为1,否则顺序为字母顺序,因此10在2之前

您可以在此linq查询中使用Enumerable.OrderBy:

var files = Directory.EnumerateFiles(@"C:\temp\GeneralStats", "*.csv")
    .Select(fn => new
    {
        Path = fn,
        Split = Path.GetFileNameWithoutExtension(fn).Split('_')
    })
    .Where(x => x.Split.Length == 4)
    .Select(x => new
    {
        x.Path,
        Date = new DateTime(int.Parse(x.Split[1]), int.Parse(x.Split[2]), int.Parse(x.Split[3]))
    })
    .OrderBy(x => x.Date)
    .Select(x => x.Path);
首先,我从Path类中选择一个匿名类型,它具有一些有用的属性,比如GetFileNameWithoutExtension。这将使查询的其余部分更高效、更可读。Where用于防止文件名中没有日期部分的文件出错。下一个select从string.Split派生的标记中解析日期时间。最后三部分包含年、月和日。订购人将按日期订购。最后,我再次选择完整路径,因为您最初希望对文件进行排序

您可以使用foreach枚举结果,如果要持久化,可以使用例如ToList:

foreach (string f in files)
{
    // ...
}

搜索人工排序或自然排序顺序使用两位数表示月份和天数!或者在实现可能的副本时享受乐趣。这个问题不是很好,但最重要的答案应该是一个解决方案-它基本上显示了如何使用与Windows相同的底层功能对文件进行排序。以YMD顺序写入日期,然后使用单个数字表示日期,这似乎有点奇怪。。。我会修正这个问题,而不是胡乱摆弄自然排序顺序。@LeneJungKjær-这就是Ivan答案旁边的勾选选项的目的-这样你就可以表明你的问题得到了回答。第二个想法是否正确处理了2012_1_11和2012_11_1?@KierenJohnstone,我不认为是这样的,这就是我删除它的原因:谢谢你注意到它。它工作得很好-非常感谢你,我很感激伊万G@LeneJungKjær太好了,我很高兴它有帮助:我用PadLeft2修复了第二个版本的排序,“0”在一位数的月份或天数前加上“0”的年份不受影响。谢谢,我真的很感激-我不能很好地解决这个问题,但下面来自Ivan G的答案为我解决了它。@LeneJungKjær:也许你在.NET 3.5上,EnumerateFiles需要.NET framework 4,然后简单地用GetFiles替换它,GetFiles首先将所有文件读入内存。其余的也适用于3.5。好的,谢谢@TimSchmelter的信息,谢谢你的帮助。