2012-01-26 3 views
14

У меня есть два объекта:Linq запрос между два списка объектов

ObjectA 
{ 
    string code; 
    string country; 
} 

ObjectB 
{ 
    string code; 
    string otherstuff; 
} 

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

+2

1. У вас есть один символ 'objectA' или вам это нужно для всех объектов из списка' '. 2. Какова планировка ожидаемого результата? 3. Что вы пробовали до сих пор? – Krizz

+0

Также посмотрите на IEnumerable.Intersect: http://msdn.microsoft.com/en-us/library/bb460136.aspx Вам необходимо переопределить 'Equals' и' GetHashCode' в обоих случаях и позволить сравнивать друг с другом через 'Code'. –

ответ

29

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

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

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

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

Похоже, что вы хотите присоединиться к списку 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 свойство: а тип Objecta, б типа ObjectB, с тем же code

5

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

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)); 
+0

Спасибо Оливье. Знаете ли вы хорошие учебники в linq или книги с примерами в скорости и т. Д.? – Reno

+2

Для LINQ Google [учебник LINQ C#] (http://www.google.com/search?q=LINQ+tutorial+C%23). Что касается скорости, то здесь важно иметь базовые знания о разных типах коллекций, а также их плюсы и минусы. Джеймс Майкл Харе дает хороший обзор здесь: [Выбор правильного класса коллекций] (http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class .aspx) –

Смежные вопросы