2016-06-21 2 views
0

У меня есть список GroupMembershipValidList, который содержит объекты типа GroupMembershipUploadInput.LINQ Запрос из одной коллекции, чтобы заполнить другую

Это GroupMembershipUploadInput определение класса выглядит

public class GroupMembershipUploadInput 
    { 
     public string chpt_cd { get; set; }} 
     public string cnst_last_nm { get; set; } 
     public string appl_src_cd { get; set; } 

    } 

Я упростил определение для простоты.

Теперь у меня есть еще один список _validChapterCodes (public List<ChapterCodeValidationOutput> _validChapterCodes { get; set; })

, который содержит объекты типа

public class ChapterCodeValidationOutput 
{ 
    public string chpt_cd { get; set; } 
    public string appl_src_cd { get; set; } 
} 

Итак, что я хочу сделать, это .. если chpt_cd из списка A соответствует список B , затем введите имена appl_src_cd из списка B в список объектов A.

Как бы это сделать в LINQ?

Я пытался ...

gmvo.GroupMembershipValidList.GroupMembershipUploadInputList.Where(x => gmvo._validChapterCodes.Contains(x.chpt_cd)).Select(y => y.appl_src_cd); 

Но я знаю, что я не делаю это правильно.

+0

Вы должны реально смотреть на предоставление ваших свойств осмысленные имена. Это хорошая привычка. –

ответ

1

LINQ имеет функциональные подход, имея в виде, что это для получения значений из множества существующих значений, а не для манипулирования существующих значений.

Так что вы не можете избежать по крайней мере одного foreach здесь. Я хотел бы сделать это следующим образом:

foreach(var chapter in _validChapterCodes) 
{ 
    ChapterCodeValidationOutput output = GroupMembershipValidList.FirstOrDefault(e => 
     e.chpt_cd == chapter.chpt_cd); 
    if (input != null) chapter.appl_src_cd = input.appl_src_cd; 
} 

FirstOrDefault() возвращает первый элемент из списка ввода с соответствующим chpt_cd или null, если нет соответствующего элемента.


EDIT: Из вашего вопроса я не уверен, если вы хотите это тот путь, или наоборот (что перечень А и список B?). Таким образом, для полноты в обратном порядке:

foreach(var input in GroupMembershipValidList) 
{ 
    var chapter = _validChapterCodes.FirstOrDefault(e => 
     e.chpt_cd == input.chpt_cd); 
    if (chapter != null) input.appl_src_cd = chapter.appl_src_cd; 
} 
+0

Хорошо, но если для второго объекта в списке chpt_cd совпадает с первым объектом, для второго объекта appl_src_cd идет как null. Как я могу избежать этого? – StrugglingCoder

+0

Нет, если это тот же 'chpt_cd', он вернет тот же самый элемент. Вы не указали в своем вопросе, являются ли те 'chpt_cd' уникальными или что вы хотите заполнить 'appl_src_cd', если они не являются. –

1

Вы можете использовать выражение LINQ.

var a = new List<GroupMembershipUploadInput> 
{ 
    new GroupMembershipUploadInput() {chpt_cd = "A" }, 
    new GroupMembershipUploadInput() {chpt_cd = "A2"" }, 
    new GroupMembershipUploadInput() {chpt_cd = "A3" } 
}; 

var b = new List<ChapterCodeValidationOutput> 
{ 
    new ChapterCodeValidationOutput() {chpt_cd = "A", appl_src_cd = "ACode"}, 
    new ChapterCodeValidationOutput() {chpt_cd = "C2", appl_src_cd = "C22"}, 
    new ChapterCodeValidationOutput() {chpt_cd = "A3", appl_src_cd = "A33"} 
}; 


var result = a.Select(s => new GroupMembershipUploadInput 
{ 
    chpt_cd = s.chpt_cd, 
    appl_src_cd = b.Any(u => u.chpt_cd == s.chpt_cd) ? 
          b.First(v => v.chpt_cd == s.chpt_cd).appl_src_cd:string.Empty 
}).ToList(); 

Предполагая это совокупность GroupMembershipUploadInput и Ь представляет собой сборник ChapterCodeValidationOutput

+0

Будет ли она заполнять ту же коллекцию здесь? – StrugglingCoder

+0

Да. результатом будет весь новый список со всеми элементами из a, но с свойством appl_src_cd, заполненным значениями из коллекции b для соответствующих элементов. – Shyju

+1

В этом суть, создает список _new_, но не заполняет список _existing_, как заданный вопрос. –

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