2014-12-23 4 views
0

Я видел сообщения, как внизу, которые мне очень трудно понять. Поэтому я переписываю его. Извините, если кто-то чувствует, что это дубликат. Я только простые требованияОбъединить списки в один

C# Joins/Where with Linq and Lambda

У меня есть класс, как этот

public class Person 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public string MailingAddress{get;set;} 
} 

У меня есть метод, как показано ниже

public IList<Person> GetNames(IList<int> ids) 

Это даст мне список людей, как показано ниже

1 "Сэм" ""

2 "Dev" ""

4 "Hummy"

У меня есть еще один способ, как показано ниже

public IList<Person> GetMailingAddress(IList<int> ids) 

Это даст мне список лиц, как ниже

1 "" "ABC"

6 "" "TTT"

2 «» «XYZ»

Теперь нужно объединить результаты двух методов, так что я могу иметь мой окончательный результат, как этот

1 «Сэм», «ABC»

2 «Dev» " XYZ "

ОБНОВЛЕНИЕ: Извините, что я не дал однозначных данных. Пожалуйста, см. Выше моих данных теста.

+0

Если у вас есть два списка одинаковой длины с коррелированными индексами, которые вы хотите объединить в один список, операция, которую вы ищете, - ['Zip'] (http://msdn.microsoft.com/ru -us/библиотека/dd267698 (v = vs.110) .aspx). Для более сложной «корреляции» вы должны использовать ['Присоединиться'] (http://msdn.microsoft.com/en-us/library/bb534675 (v = vs.110) .aspx), где вы можете определить логику, которая составляет матч. Ни одно из них не является слиянием в том, что они не изменяют исходные коллекции, это * проекции * в новую коллекцию. –

+0

К сожалению, из вашего вопроса не совсем ясно, что вы пытаетесь сделать. Почему у вас есть два разных метода для возврата объектов «Person» на основе значения ID? Вы имеете дело с двумя разными таблицами данных или чем-то еще? Было бы более целесообразным создать метод, который заполняет все поля класса за одну операцию? Возможно ли, что вы будете передавать разные списки 'ids' для каждого метода? Метод 'Zip' может помочь, если вы всегда возвращаете объекты для одинаковых идентификаторов в том же порядке в обоих случаях. –

+0

@Preston - я не могу использовать Zip, так как мои два списка не одинаковой длины. Я использовал соединение для решения моей проблемы. Пожалуйста, см. Ниже – Ziggler

ответ

5

Я немного смущен тем, что возвращают ваши методы, если вам нужно совместить два результата, чтобы получить полные Person объекты, тогда есть два способа, которыми вы могли бы заставить все работать.

  1. Если вы можете рассчитывать на такое же количество объектов, возвращаемых в том же порядке, вы можете попробовать:

    names.Zip(mailingAddresses, (n, m) => new Person 
    { 
        Id = n.Id, 
        Name = n.Name, 
        MailingAddress = m.MailingAddress 
    }); 
    
  2. Если вы не можете полагаться на обоих из этих условий, вы можете использовать Join:

    names.Join(mailingAddresses, n => n.Id, m => m.Id, (n, m) => new Person 
    { 
        Id = n.Id, 
        Name = n.Name, 
        MailingAddress = m.MailingAddress 
    }); 
    

Даже если у вас есть эти два варианта, есть третья и Бетт er, если у вас есть контроль над кодом, который фактически получает объекты из источника данных. Если вы знаете, что вам нужны эти две части данных, вы должны создать единый метод, который запрашивает источник данных за один раз, чтобы получить все данные, а не запрашивать один раз на кусок данных.

+0

Обратите внимание, что первый метод возвращает мне объекты с идентификатором и именем. Второй дает мне Id и MailingAddress После получения обоих результатов мне нужно объединить их, чтобы получить Id, Name и MailingAddress. – Ziggler

+0

@ Ziggler Это то, что делает его код. –

+0

@Preston Guillot - Я написал этот комментарий до того, как код был отправлен. будет изучать его. – Ziggler

1

Enumerable.Zip определенно решит вашу проблему.

+0

Я пробовал с Zip, как показано ниже, но не работал. Я создал такие имена, как 1, «Сэм» и 2 «Dev». Я создал адрес типа 1, «ABC» и 4 «XYZ». Я использовал Zip, но я получаю его как 1, «Сэм», «ABC: (это правильно) и 2,« Dev »,« XYZ », что неверно. Я не смог опубликовать свой Zip-запрос. by Mitja S выше. – Ziggler

+0

Zip didnot work, но Justin's. Вариант 2 Присоединиться выше работал для меня – Ziggler

+0

Я не знаю, как это получило 3 голоса. Это явно не разрешило мою проблему. – Ziggler

0

Вы можете решить с Enumerable.Zip и заказные данные до:

IEnumerable<Person> list = GetNames(new List<int>()).OrderBy(p => p.Id).Zip(GetMainlingAddress(new List<int>()).OrderBy(p => p.Id), (first, second) => { return new Person() { Id = first.Id, Name = first.Name, MailingAddress = second.MailingAddress }; }); 
+0

Я создал имена как 1, «Сэм» и 2 «Дев». Я создал адрес типа 1, «ABC» и 4 «XYZ». Я использовал Zip, но я получаю его как 1, «Сэм», «ABC: (это правильно) и 2,« Dev »,« XYZ », что неверно. Я не смог опубликовать свой Zip-запрос. по Mitja S выше. – Ziggler

0

Выполнение присоединиться на этих двух методов возврата значений по Lambda стиле Linq синтаксиса:

var query = GetNames().Join(GetMailingAddress(), 
            n => n.Id, 
            e => e.Id, 
            (n, e) => new { n.Id,n.Name,e.Email}); 

     foreach (var item in query) 
     { 
      Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email); 
     } 

Perform присоединиться на этих двух методов возвращаемые значения синтаксисом Linq Sql-стиля:

var query = from n in GetNames() 
      join e in GetMailingAddress() 
      on n.Id equals e.Id 
      select new {n.Id,n.Name,e.Email }; 
foreach (var item in query) 
    { 
     Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email); 
    } 

Примечание. Где метод GetName() и GetMailingAddress() возвращает список набора результатов.

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