按.NET中的条件列出交集

时间:2011-12-06 17:16:11

标签: c# linq tuples intersection ilist

这是我的观点: 这是数据类:

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具有相同名称的数据项,则为null。 考虑到结果应该是:

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

你可以帮助LINQ代码执行吗? 我用这个绞尽脑汁......

2 个答案:

答案 0 :(得分:3)

如果我正确解释了你的问题:

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();

答案 1 :(得分:0)

谢谢你们 - 但似乎我得到了回答我的两个问题: 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();

在.NET 2.0-3.5中使用Tuple - 查看here