带来多扩展名文件并在列表到达末尾时停止循环它们 - c#

bring multi extension files and stop looping them when the list reach the end - c#

我有一个简单的软件可以循环 multi Images/videos
并使用 (Next)-(previous) 按钮 一个一个 显示它们

到目前为止,我一次只成功带来一次延期:

string[] FileList = Directory.GetFiles(Dir, "*.jpg", SearchOption.AllDirectories);

我尝试使用以下代码在列表到达末尾时停止循环:

int currentPosition = 0;
if (currentPosition != ImageList.Length) currentPosition++;

请原谅我的错误,因为我在 C# 中仍然是新手,但是当我调试它时说
> IndexOutOfRangeException

在我像这样添加多个扩展后:

    string[] VOut_AVI = Directory.GetFiles(@Curr_DirectoryName, "*.avi", SearchOption.AllDirectories);
    string[] VOut_MP4 = Directory.GetFiles(@Curr_DirectoryName, "*.mp4", SearchOption.AllDirectories);
    string AddMP4 = VOut_MP4[VOut_MP4.Length - 1];
    //------ Adding other format to our call ------------
    Array.Resize(ref VOut_AVI, VOut_AVI.Length + 1);
    VOut_AVI[VOut_AVI.Length - 1] = AddMP4;

    // just for test ----->>
    MessageBox.Show("Video link : " + VOut_AVI[currentPosition]);

我得到这个错误说 (XamlParserException) 那个。

如果您知道不用 像我一样使用那么多编码我会很高兴知道它 如果你能指导我以正确的方式,我的循环过程也不是那么好,我仍在学习这些东西对我来说有点困难因为我来自一个完全不同的环境,提前感谢

Length returns 项数,但将从索引 0,1 检索。

例如,如果您的列表共有 2 条记录,那么您只能访问 0,1 索引中的项目。它在第二个索引中不可用,因此会引发错误。

变为ImageList.Length-1

要获取所有具有不同扩展名的文件,您可以使用扩展名类型为 * 的 EnumerateFiles。您也可以使用 where 子句过滤文件。

var resufile = Directory.EnumerateFiles(@"fullpath", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp4") || s.EndsWith(".jpg"));  //different extension you can specify it

要获取具有不同扩展名的文件名列表,请使用 Directory.EnumerateFiles 并连接这些查询。

IEnumerable<string> myFilesQuery = new string[] { };

myFilesQuery = myFilesQuery.Concat( Directory.EnumerateFiles( dir, "*.avi", SearchOption.AllDirectories ) );
myFilesQuery = myFilesQuery.Concat( Directory.EnumerateFiles( dir, "*.mp4", SearchOption.AllDirectories ) );
myFilesQuery = myFilesQuery.Concat( Directory.EnumerateFiles( dir, "*.jpg", SearchOption.AllDirectories ) );

// nothing will happen until we call

IList<string> myFiles = myFilesQuery.ToList( );

如果你喜欢one-line-of-code你的代码,写一个像

这样的助手
public static class DirectoryHelper
{
    public static IEnumerable<string> EnumerateFiles( 
        string path, 
        SearchOption searchOption, 
        params string[] searchPatterns )
    {
        if ( searchPatterns == null )
            throw new ArgumentNullException( nameof( searchPatterns ) );

        IEnumerable<string> result = new string[] { };

        foreach ( var searchPattern in searchPatterns )
        {
            result = result.Concat( Directory.EnumerateFiles( path, searchPattern, searchOption ) );
        }

        return result;
    }
}

在我们的代码中你只有

IList<string> myFiles 
    = DirectoryHelper
        .EnumerateFiles( 
            dir, 
            SearchOption.AllDirectories, 
            "*.avi", "*.mp4", "*.jpg" )
        .ToList();

您不必担心数组的任何长度。该列表将包含 Count 属性.

中的元素数

所有集合都是 zero-based,第一项的索引为 0,最后一项的索引为 Count-1(集合)或 Length-1(数组)。当 currentPosition >= mylist.Count-1 时到达终点,只要 currentPosition < mylist.Count-1.

就可以增加索引

更新

这里已经有关于 SO dealing with multiple search patterns with a parallel implementation 的答案