如何基于属性合并两个列表?

Bru*_*oLM 8 c# linq list

我有两个列表,一个是假的,一个是真的,如:

之前

// fake (list 1)
{ ID = 1, Year = 2011, X = "" }
, { ID = 2, Year = 2012, X = "" }
, { ID = 3, Year = 2013, X = "" }

// real (list 2)
{ ID = 35, Year = 2011, X = "Information" }
, { ID = 77, Year = 2013, X = "Important" }
Run Code Online (Sandbox Code Playgroud)

我想合并他们寻找年份,结果应该是:

{ ID = 35, Year = 2011, X = "Information" }
, { ID = 2, Year = 2012, X = "" }
, { ID = 77, Year = 2013, X = "Important" }
Run Code Online (Sandbox Code Playgroud)

它必须在第一个列表中删除具有相同年份的元素,并将第二个列表中具有等效Year的元素添加到第一个列表中,保持顺序.

我怎么能用Linq做到这一点?

Jus*_*ner 9

你应该可以使用"左连接"来做到这一点:

from f in fake
join r in real
on f.Year equals r.Year
into joinResult
from r in joinResult.DefaultIfEmpty()
select new
       {
           ID = r == null ? f.ID : r.ID,
           Year = f.Year,
           X = r == null ? f.X : r.X
       };
Run Code Online (Sandbox Code Playgroud)


Ada*_*ras 5

Justin的查询是最有效的方法,但如果您关心保留相同的对象(而不是从查询中创建新记录),您可以这样做:

var combined = from f in fake
               let r = (from r1 in real
                        where r1.Year == f.Year
                        select r1).SingleOrDefault()
               select r ?? f;
Run Code Online (Sandbox Code Playgroud)