C# 在LINQ中连接两个列表
假设我有两个位置列表。First拥有所有可用位置:C# 在LINQ中连接两个列表,c#,linq,join,C#,Linq,Join,假设我有两个位置列表。First拥有所有可用位置: List<Location> locations = new List<Location> { new Location { id = 1, address = "1 Main St.", selected = false }, ... } List<int> myLocations = new List<int> { 1, 5, 8 }; 然后将所有位置标记为选中;更不用说它看起
List<Location> locations = new List<Location> {
new Location { id = 1, address = "1 Main St.", selected = false },
...
}
List<int> myLocations = new List<int> { 1, 5, 8 };
然后将所有位置标记为选中;更不用说它看起来过于复杂了。
有没有一种方法可以在不循环列表元素的情况下实现我想要的功能?取决于您的状态 我的位置保证是所有位置的子集 您可以实现左连接而不是外部连接 试着跟随
locations.Select(l => new Location
{
id = l.id,
adress = l.adress,
selected = myLocations.Any(ml => ml == l.id)
})
因为您需要为内存中已经存在的每个位置设置selected属性,所以您可以使用ForEach扩展方法,如下面的代码所示:
locations.ForEach(location => location.selected = myLocations
.Any(id => id == location.id)
);
使用这段代码,您不会像使用“投影选择新位置”一样在内存中创建位置的新实例。使用同一实例进入您的位置。您太接近了
在上一个查询中,您实际实现了所谓的左外部联接,但更适合此场景的是
由于LINQ中的左外部联接实际上是通过组联接实现的,所以只需删除该行即可
from m in myloc.DefaultIfEmpty()
并使用selected=myloc。任何类似的
var result = from loc in locations
join my in myLocations
on loc.id equals my into myloc
select new Location {
id = loc.id, address = loc.address, selected = myloc.Any()
};
如果可以修改原始位置对象,则CodeNotFound的答案是有效的 如果您需要一些纯粹作为查询而没有副作用的东西,这通常更符合Linq的精神,那么下面的内容就可以了。 这与tchelidze的答案类似,但避免创建所有不匹配对象的新实例:
locations.Select(l => myLocations.Any(i => i == l.id) ?
new Location {id = l.id, address = l.address, selected = true } : l);
或使用查询语法:
from location in locations
select myLocations.Any(i => i == location.id)
? new Location {
id = location.id,
address = location.address,
selected = true }
: location;
所有答案都非常棒,可以实现。事实上,我很尴尬,因为我一开始就错过了任何选择。我最喜欢这个,因为我可以在上游实现它——也就是说,当我从数据库获取数据时。Kamarjoba,Genatsvali:@Felix很高兴能帮助Felix。很高兴你知道格鲁吉亚语。格默特玛·加吉马科斯:你说得对,谢谢!但事实是,我可以首先应用@tchlidze answer来构建列表。也就是说,我不会有一个所有选定成员都为false的列表来首先应用ForEach。。。
from location in locations
select myLocations.Any(i => i == location.id)
? new Location {
id = location.id,
address = location.address,
selected = true }
: location;