Запрос Linq между двумя объектами списка

У меня есть два объекта:

ObjectA
{
   string code;
   string country;
}

ObjectB
{
   string code;
   string otherstuff;
}

И у меня есть List<objectA> и List<ObjectB>, и мне нужно найти все объекты в List<ObjectB>, который содержит objectA.Code. Но не удается реализовать его в запросе LINQ.

Ответы

Ответ 1

Похоже, вы пытаетесь найти все экземпляры ObjectB, которые имеют значение code, присутствующее в любом из значений List<ObjectA>. Если да, попробуйте следующее

List<ObjectA> listA = ...;
List<ObjectB> listB = ...;
var all = listB.Where(b => listA.Any(a => a.code == b.code));

Ответ 2

Похоже, вы хотите присоединиться к списку ObjectA со списком ObjectB в свойстве code. Это один из способов:

List<ObjectA> listOfA = ...;
List<ObjectB> listOfB = ...;
var all = from a in listOfA
          join b in listOfB on a.code equals b.code
          select new {a,b};

Результатом является список анонимных объектов, содержащий 2 свойства: a типа ObjectA, b типа ObjectB, с тем же code

Ответ 3

Чтобы сделать это эффективно, вы можете сначала поместить коды в HashSet<string>, а затем использовать запрос Contains(), чтобы проверить, имеет ли рассматриваемый B код, который содержится в хэш-наборе:

var codes = new HashSet<string>(listOfAs.Select(x => x.code));
var selectedBs = listOfBs.Where( x=> codes.Contains(x.code));

Ответ 4

Я бы поместил коды в список ObjectA в HashSet, иначе ваш запрос станет операцией O (n 2). Подобным образом это операция O (n):

var aList = new List<ObjectA>();
var bList = new List<ObjectB>();

var aCodes = new HashSet<string>(aList.Select(a => a.code));
var result = bList.Where(b => aCodes.Contains(b.code));