我认为它可以在 C# 中轻松完成。如果您将实体映射到类似的东西:
[DataContract]
public class Entity
{
[DataMember(Name = "Id")]
public string Id { get; set; }
[DataMember(Name = "a")]
public int? A { get; set; }
[DataMember(Name = "b")]
public int? B { get; set; }
[DataMember(Name = "c")]
public int? C { get; set; }
}
我认为使用 LINQ 无法执行所需的操作,但好的旧 foreach 将解决您的问题。
编辑:实际上在查看@vadim-gremyachev 的答案后,我认为使用 LINQ 可以很好地完成:
var l1 = JsonConvert.DeserializeObject<IList<Entity>>(
@"[{""Id"":""1"", ""a"":""1"", ""b"":""2""},
{""Id"":""2"", ""a"":""3"", ""b"":""1""},
{""Id"":""3"", ""a"":""5"", ""b"":""1""}]");
var l2 = JsonConvert.DeserializeObject<IList<Entity>>(
@"[{""Id"":""1"", ""a"":""32"", ""b"":""42""},
{""Id"":""2"", ""a"":""3"", ""b"":""1"", ""c"":""23""},
{""Id"":""12"", ""a"":""12"", ""b"":""45""}]");
// LINQ
var res = l1.Concat(l2).GroupBy(x => x.Id).Select(x => x.Last()).ToList();
// Foraech
var res2 = new List<Entity>(l1);
foreach (var l2Entity in l2)
{
var resEntity = res2.FirstOrDefault(x => x.Id == l2Entity.Id);
if (resEntity == null)
{
res2.Add(l2Entity);
}
else
{
res2[res2.IndexOf(resEntity)] = l2Entity;
}
}
然后您可以将您的 res 列表序列化回 JSON 并完成:
var json = JsonConvert.SerializeObject(res);
生成的 JSON 将是:
[
{"Id":"1","a":32,"b":42},
{"Id":"2","a":3,"b":1,"c":23},
{"Id":"3","a":5,"b":1},
{"Id":"12","a":12,"b":45}
]
您也可以使用l1 而不要创建res,这当然取决于您的情况。您可能还想在合并完成后按键对生成的集合进行排序。