c#中的循环优化

Posted

技术标签:

【中文标题】c#中的循环优化【英文标题】:loop optimization in c# 【发布时间】:2017-02-28 02:28:39 【问题描述】:

我正在使用 c# 为 pc 开发一个音乐播放器,一切似乎都很好,但是,我在从音乐目录加载所有音乐文件时遇到问题,因为它加载非常缓慢,并且在打开应用程序时需要一些时间,它可能需要 5 分钟,具体取决于音乐文件的数量。我认为这是因为我创建了一个循环来循环遍历每个音乐文件并获取元数据以及要为每个音乐文件加载到不同图片框的图片。 请帮助,我需要它更快。谢谢你。 代码如下...

    public List<MusicDetails> Music_Library()
    


         List<MusicDetails> files = new List<MusicDetails>();
        string[] musicfolder = Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic),"*mp3", SearchOption.AllDirectories);


        for (int i = 0; i <musicfolder.Length; i++)
        
            try 
                files.Add(new MusicDetails
                
                    title = TagLib.File.Create(musicfolder[i]).Tag.Title,
                    genre = TagLib.File.Create(musicfolder[i]).Tag.FirstGenre,
                    artist = TagLib.File.Create(musicfolder[i]).Tag.FirstPerformer,
                    path = musicfolder[i],
                    CoverArt = OrganiseAlbums.SingleAlbumImage(musicfolder[i],true)


                );
            catch(Exception)
            
              // OMIT FILE
              
        
        return files;

    

【问题讨论】:

如果您不显示此代码,您认为如何帮助您修复错误代码? 在后台使用图片和元数据的存根信息异步加载文件。在单独的线程中加载图片和元数据。 【参考方案1】:

您可以尝试使用后台线程将循环替换为并行 foreach 循环 - 在处理每个项目时将其添加到 UI,并让 .Net 确定处理所有内容的最有效方式。如果操作正确,您的 UI 将保持响应式,并且您的用户会从“足够看……”开始,这是一个帮助您入门的链接:

https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

但是,如果您有大量音乐文件,您可能不想一次将它们全部加载到内存中。我会研究某种允许虚拟化的列表控件或布局控件,以便您在任何给定时间仅实例化和显示可见的控件。使用教程了解如何绑定到您的集合以实现虚拟化。

如果您发布更具体的问题并附上您尝试过的示例,您将获得更具体的答案...

【讨论】:

我确信您正在使用某种布局控件(如 GridView 或 FlowLayoutPanel 或其他东西)来显示它。您是将该布局控件绑定到您在代码中返回的列表,还是循环遍历该列表以将每个 MusicDetails 项目添加到 Items 集合?

以上是关于c#中的循环优化的主要内容,如果未能解决你的问题,请参考以下文章

如何使用linq c#优化嵌套循环并从另一个列表中过滤

18 C#中的循环执行 for循环

C# 中的数学优化

C#中的foreach循环怎么用?

C# 中的循环按钮背景图像

C#中的for循环