Обновление сразу двух полей наблюдаемого элемента коллекции с помощью Linq - PullRequest
0 голосов
/ 12 июня 2018

У меня есть два списка Observable Collection одного и того же типа:

ObservableCollection<MyDataModel> source;
ObservableCollection<MyDataModel> target;

Предположим, они уже заполнены, поэтому я пытаюсь обновить цель из источника, но только два поля и первый элемент, который соответствует (яхочу оставить остальные поля неприкосновенными):

foreach (var s in source)
{
    target.First(t => t.Id == s.Id).Id = s.Id;
    target.First(t => t.Id == s.Id).Desc = s.Desc;
}

Моя модель:

public class MyDataModel
{
    public int Id { get; set; }
    public string Desc { get; set; }
    public string Country { get; set; }
    public string PostalCode { get; set; }
}

В вышеупомянутом foreach я повторяю target.First дважды, и я хотел бы избежать этого исделать это сразу.Возможно ли использовать Linq?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Простой ответ:

foreach (var s in source)
{
    var t = target.First(x => x.Id == s.Id);
    t.Desc  = s.Desc;       
    t.Country = s.Country;
}

Простой ответ - операция O (источник * цель).Производительность может быть улучшена до O (источник + цель) с помощью словаря:

var sourceDict = source.ToDictionary(s => s.Id);
foreach (var t in target)
{
    MyDataModel s;
    if (sourceDict.TryGetValue(t.Id, out s))
    {
        t.Desc = s.Desc;
        t.Country = s.Country;
    }
}
0 голосов
/ 12 июня 2018

Вы можете просто сделать First() один раз и присвоить результат переменной.

foreach (var s in source)
{
    var item = target.First(t => t.Id == s.Id);
    item.Id = s.Id;
    item.Desc = s.Desc;
}

Кроме того, поскольку ваш критерий для поиска элемента - если идентификаторы совпадают, вам на самом деле не нужноitem.Id = s.Id; step.

EDIT

Однако приведенный выше код может привести к возникновению исключения, если элемент не был найден в цели.Это был бы лучший подход:

foreach (var s in source)
{
    var item = target.Where(t => t.Id == s.Id).FirstOrDefault();
    if (item != null)
    {
        item.Id = s.Id;
        item.Desc = s.Desc;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...