Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ合并对象列表_C#_Linq - Fatal编程技术网

C# 使用LINQ合并对象列表

C# 使用LINQ合并对象列表,c#,linq,C#,Linq,我有两个对象列表,使用Linq我想合并它们,但是如果两个列表包含具有相同键的对象,我只想要具有最大LastUpdated值的一个 我想我可以用max(LastUpdated)按键a得到一个列表分组,然后按键和LastUpdated重新加入列表,但必须有一种更有效的方法 List<MyObject> lstListA = new List<MyObject>; List<MyObject> lstListB = new List<MyObject>;

我有两个对象列表,使用Linq我想合并它们,但是如果两个列表包含具有相同键的对象,我只想要具有最大LastUpdated值的一个

我想我可以用max(LastUpdated)按键a得到一个列表分组,然后按键和LastUpdated重新加入列表,但必须有一种更有效的方法

List<MyObject> lstListA = new List<MyObject>;
List<MyObject> lstListB = new List<MyObject>;

public class MyObject
{
    public string Key {get;set;}
    public string Value {get;set;}
    public DateTime LastUpdated {get;set;}
}
List lstListA=新列表;
列表lstListB=新列表;
公共类MyObject
{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
公共日期时间上次更新{get;set;}
}

一个选项,使用
区别于以下内容:


有点复杂,但这似乎也起作用:

var mergedItems = lstListA.Concat(lstListB);

mergedItems =
    (from item in mergedItems
    group item by item.Key into grp
    let sameKey = mergedItems.Where(obj => obj.Key == grp.Key)
    select sameKey.Where(obj => obj.LastUpdated == grp.Max(obj2 => obj2.LastUpdated)).Single()
).ToList();
经典的挑战者

IEnumerable<MyObject> query = lstListA
  .Concat(lstListB)
  .GroupBy(x => x.Key)
//now work with each group to pick a winner
  .Select(g => g.OrderByDescending(x => x.LastUpdated).First())
IEnumerable查询=lstListA
.Concat(lstListB)
.GroupBy(x=>x.Key)
//现在与每组一起挑选一名获胜者
.Select(g=>g.OrderByDescending(x=>x.LastUpdated).First())

DistinctBy与使用Distinct与比较器有何不同?结果会是一样的吗?@Jeremy:是的,结果是一样的-区别只是更容易:)
IEnumerable<MyObject> query = lstListA
  .Concat(lstListB)
  .GroupBy(x => x.Key)
//now work with each group to pick a winner
  .Select(g => g.OrderByDescending(x => x.LastUpdated).First())