C# 在LINQ中连接两个列表

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 }; 然后将所有位置标记为选中;更不用说它看起

假设我有两个位置列表。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 };
然后将所有位置标记为选中;更不用说它看起来过于复杂了。
有没有一种方法可以在不循环列表元素的情况下实现我想要的功能?

取决于您的状态

我的位置保证是所有位置的子集

您可以实现左连接而不是外部连接

试着跟随

  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;