比较两个列表:一个包含对象,另一个包含字符串

时间:2019-12-20 16:39:08

标签: c# list linq

我正在尝试比较两个列表以添加(在另一个列表中)我想要的灯。 我想通过字符串名称

获得轻质物体

目前,我正在使用double foreach,但是我知道LinQ可以实现,但是我不知道如何...

private readonly string[] lightsWanted = { "MyLight1", "MyLight2" };
---
var lights = await this.bridgeManager.GetLights();
foreach (Light light in lights)
{
    foreach (string lightWanted in this.lightsWanted)
    {
        if (light.Name == lightWanted)
        {
            this.selectedLights.Add(light);
        }
    }
}

谢谢您的帮助。

3 个答案:

答案 0 :(得分:1)

使用位置和包含(效率不高)。

List<Light> lightsIWant = (await this.bridgeManager.GetLights())
    .Where(l => lightsWanted.Contains(l.Name))
    .ToList();

使用联接(效率更高)

var allLights = await this.bridgeManager.GetLights();
IEnumerable<Light> lightsIWant = from allLight in allLights
                                 join desiredLightName in lightsWanted 
                                     on allLight.Name equals desiredLightName
                                 select allLight;

您也可以使用扩展方法进行Join,我只是更喜欢对此类简单内容使用查询语法。

答案 1 :(得分:1)

您可以为此目的使用加入

UISettings settingsManager = UISettings.getInstance();
UISettingsState settings = settingsManager.getState();

settingsManager.setFontSize(settingsManager.getFontSize() + 1);
if (!settings.getOverrideLafFonts()) {
    settings.setOverrideLafFonts(true);
}

LafManager.getInstance().updateUI();

答案 2 :(得分:1)

这应该做到:

List<Light> lightsIwant = (from l in lights
                           join lw in lightsWanted on l.Name equals lw
                           select l).ToList();