我有一个代码应该重复5次,如下所示:
VideoCaptureDevice videoSource3 = new VideoCaptureDevice(videoDevices[2].MonikerString);
videoSource3.DesiredFrameRate = 10;
videoSourcePlayer3.VideoSource = videoSource3;
videoSourcePlayer3.Start();
所有指数3应在1到5之间变化。
有没有紧凑的形式,而不是编码这4行5次?
答案 0 :(得分:2)
首先要注意的是,拥有一个集合几乎总是比在其名称之后用索引声明多个变量更好。这样你就可以以统一的方式对它们进行操作。对于UI框架而言,这并不总能很好地发挥作用,而且通常情况下,每个控件通常都会有一个变量 - 但如果您正在寻找它,那么通常会有一种方式。
您还没有显示videoSourcePlayer3
初始化,但我现在要假设您想根据设备创建所有播放器(已经在集合中,从它的外观看。)
你可以通过列表和循环轻松地开始这样做。我不得不猜测一些名字。
// Create the players
List<VideoPlayer> videoSourcePlayers = new List<VideoPlayer>();
for (int i = 0; i < 5; i++)
{
VideoCaptureDevice source = new VideoCaptureDevice(videoDevices[i].MonikerString);
source.DesiredFrameRate = 10;
VideoPlayer player = new VideoPlayer();
player.VideoSource = source;
videoSourcePlayers.Add(player);
}
// Start all the players
foreach (VideoPlayer player in videoSourcePlayers)
{
player.Start();
}
接下来,使用对象初始化器使第一个循环中的代码更简单。 (我不会再次在第二个循环中显示代码 - 每个代码段都是相同的。)
List<VideoPlayer> videoSourcePlayers = new List<VideoPlayer>();
for (int i = 0; i < 5; i++)
{
videoSourcePlayers.Add(new VideoPlayer
{
VideoSource = new VideoCaptureDevice(videoDevices[i].MonikerString)
{ DesiredFrameRate = 10 }
});
}
接下来,请注意这实际上只是videoDevices
的转换 - 所以我们可以使用LINQ来简化它:
List<VideoPlayer> videoSourcePlayers = videoDevices
.Select(device => new VideoCaptureDevice(device.MonikerString) { DesiredFrameRate = 10 })
.Select(source => new VideoPlayer { VideoSource = source })
.ToList();
(你可以用一个选择来做,但我认为在这种特殊情况下它更清晰。)