Skip to main content
 首页 » 编程设计

c#之C# 遍历列表

2024年04月12日11daizhj

我正在使用一些 C#,并且正在编写一个钢琴应用程序。

每当用户单击钢琴音符时,我都会将声音 (.wav) 的位置存储到列表中...以下是 button1_MouseDown 方法中的一些代码。

if (e.Button == MouseButtons.Left) 
   { 
       SoundPlayer sp = new SoundPlayer(); 
       string musName = Convert.ToString(mk.pitch); 
       string loc = @"D:\OneDrive\Year 2 Semester 1\OOP\Notes-Sound files\Notes-Sound files\mapped\" + musName + ".wav"; 
       sp.SoundLocation = loc; 
       sp.Play(); 
       music.Add(loc); 
    } 

现在,我想遍历循环以一次性播放所有单击的键。我这样做如下(当用户单击播放按钮时)

int k = 0; 
for (k = 1; k < music.Count; k++) 
{ 
   SoundPlayer sp = new SoundPlayer(); 
   sp.SoundLocation = music[k]; 
   sp.Play(); 
 } 

问题是,每当单击播放按钮时,只会播放最后按下的音符。但是,当我调试时,不知何故,所有音符都会播放。有什么想法吗?

请您参考如下方法:

根据MSDN ,这是 Play 方法的描述:

Plays the .wav file using a new thread, and loads the .wav file first if it has not been loaded.

因此,每当您调用 Play 时,它都会异步运行,并且您的循环会在当前 wav 文件完成之前继续执行播放下一个 wav 文件。当您调试时,您可能会在继续循环之前等待。

相反,请尝试使用 PlaySync同步播放声音

PS。另外,您可能需要考虑在列表中使用 SoundPlayer 的实例而不是文件名,以避免每次播放 wav 文件时创建新实例:

List<SoundPlayer> music = new List<SoundPlayer>(); 
//... 
 
//In your first loop, you would add the SoundPlayer object 
music.Add(sp); 
 
//..  
//Then when you're playing back: 
for (int k = 0; k < music.Count; k++) 
{ 
   music[k].PlaySync(); 
} 

请注意,for 循环中的索引也应从 0 开始