相机上的C#Compact Code,有可能吗?

时间:2018-04-28 07:38:37

标签: c#

我有一个代码应该重复5次,如下所示:

VideoCaptureDevice videoSource3 = new VideoCaptureDevice(videoDevices[2].MonikerString);
videoSource3.DesiredFrameRate = 10;
videoSourcePlayer3.VideoSource = videoSource3; 
videoSourcePlayer3.Start();

所有指数3应在1到5之间变化。

有没有紧凑的形式,而不是编码这4行5次?

1 个答案:

答案 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();

(你可以用一个选择来做,但我认为在这种特殊情况下它更清晰。)