[英]Compare two lists : One contain object, one other contain string
I'm trying to compare two list to add (in an other list) my lights that I want.我正在尝试比较两个列表以添加(在另一个列表中)我想要的灯。 I want to get light object by string name
我想通过字符串名称获取轻对象
For the moment, I'm using a double foreach, but I know it's possible with LinQ but I don't know how...目前,我正在使用双 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);
}
}
}
Thank you for your help.感谢您的帮助。
Using a Where and Contains (not as efficient).使用 Where 和 Contains (效率不高)。
List<Light> lightsIWant = (await this.bridgeManager.GetLights())
.Where(l => lightsWanted.Contains(l.Name))
.ToList();
Using a Join (more efficient)使用 Join(更高效)
var allLights = await this.bridgeManager.GetLights();
IEnumerable<Light> lightsIWant = from allLight in allLights
join desiredLightName in lightsWanted
on allLight.Name equals desiredLightName
select allLight;
You can do a Join using Extension Methods as well, I just prefer using the query syntax for simple stuff like this.您也可以使用扩展方法进行连接,我只是更喜欢使用查询语法来处理这样的简单内容。
您可以为此目的使用 Join
var selectedList = lights.Join(lightsWanted,x=>x.Name,y=>y,(x,y)=>x);
This should do it:这应该这样做:
List<Light> lightsIwant = (from l in lights
join lw in lightsWanted on l.Name equals lw
select l).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.