2
if (Form1.sf != null)
{
    radarDI = new DirectoryInfo(Form1.sf);
    radarFiles = radarDI.GetFiles("*.png");
    for (int i = radarFiles.Length; i > 0; i--)
    {
        myGifListRadar.Add(radarFiles[i].Name);
    }
}

雷达文件包含 224 个文件。我想添加到myGifListRadar List<string>硬盘上文件末尾的最后 5 个文件或任何最后数量的文件。

如果我这样做int I = 0 ; I < test.Length; I++会添加:

00001.png

00002.png

我希望它从最后添加:

00224.png

00223.png

依此类推...所以我尝试将 FOR 更改为现在的状态,但我遇到了异常:

指数数组的边界之外

FOR 有什么问题?

4

5 回答 5

4

它是一个零边界索引,因此它的长度为-1,您还需要大于或等于以将计数减至零,否则您将错过数组中的第一个元素。

for (int i = radarFiles.Length - 1; i >= 0; i--)
{
}
于 2013-01-28T17:05:54.623 回答
2

尝试

for (int i = radarFiles.Length - 1; i >= 0; i--)

数组和其他集合从零开始索引,所以你必须从长度中减去 1

于 2013-01-28T17:05:49.880 回答
1

改变这个:

for (int i = radarFiles.Length; i > 0; i--)

对此:

for (int i = radarFiles.Length-1; i >= 0; i--)

您从列表末尾开始。此外,您需要使用 >= 而不是仅使用 >,否则如果目录足够小,您将错过一个文件。

于 2013-01-28T17:07:22.967 回答
1

您可以使用Enumerable.OrderByDescending+ Enumerable.Take

var last5Files = Directory.EnumerateFiles(directoryPath, "*.png")
    .Select(p => new { Path = p, FileName = Path.GetFileName(p) })
    .Select(x => new { x.FileName, Number = x.FileName.TryGetInt() })
    .Where(x => x.Number.HasValue)
    .OrderByDescending(x => x.Number.Value)
    .Select(x => x.FileName)
    .Take(5);
foreach (string fn in last5Files)
    myGifListRadar.Add(fn);

这是我用来int?从您的文件名中获取 a 的扩展方法:

public static class NumericExtensions
{
    public static int? TryGetInt(this string item)
    {
        int i;
        bool success = int.TryParse(item, out i);
        return success ? (int?)i : (int?)null;
    }
}

(假设您只想要具有数字文件名的 png 文件)

于 2013-01-28T17:09:34.200 回答
1

由于您的文件具有该格式的名称,您可以使用它:

var fileList = Directory.GetFiles(path)
                  .OrderByDescending(n => Path.GetFileName(n))
                  .Take(5)
                  .ToList();
于 2013-01-28T17:10:13.140 回答