Пересечение списка по критериям в .NET - PullRequest
1 голос
/ 06 декабря 2011

Вот моя точка зрения: вот класс данных:

class Data
{
public string name; 
public int version;
}

вот списки данных:

Ilist<Data> List_old = {new Data{name = "1", version = 1}, new Data{name = "2", version = 1}};
Ilist<Data> List_new = {new Data{name = "1", version = 2}, new Data{name = "3", version = 1}, new Data{name = "2", version = 1}};

В результате мне нужен список кортежей - IList<Tuple<Data, Data>> - первый объект данных взят из List_new, второй из List_old, взятый по критериям - объекты данных имеют то же имя, но - первый имеет большую версию, чем второй ИЛИ, второй - ноль если в List_old нет ни одного элемента данных с таким же именем из List_new. Учитывая, что результат должен быть:

IList<Tuple<Data, Data>> result = { {List_new[0], List_old[0]}, {List_new[1], null}};

Не могли бы вы помочь с кодом LINQ, который может это выполнить? Я взрываю свои мозги этим ...

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Если я правильно понял ваш вопрос:

var q = 
    (from n in List_new
    join tmp in List_old on n.name equals tmp.name into g
    from o in g.DefaultIfEmpty()
    where o == null || o.version < n.version
    select new Tuple<Data, Data>(n, o)).ToList();
0 голосов
/ 07 декабря 2011

Спасибо, ребята, но, похоже, я получил ответ на оба моих вопроса: LINQ код:

IList<Tuple<Data,Data> > UpdateList = List_new.Where(
delegate(Data item)
{
return List_old.Any(y => item.name == y.name && item.Version > y.Version) ||
!List_old.Any(y => item.name == y.name);
}
).Select(
delegate(Data item)
{
Data old_item = List_old.FirstOrDefault(y => item.name == y.name && item.Version > y.Version);
return new Tuple<Data,Data>(item, old_item);
}
).ToList();

для использования Tuple в .NET 2.0-3.5 - смотрите здесь

...