2014-02-26 76 views
-6

给定以下两个词典数组,我怎样才能合并它们,使得得到的词典数组仅包含那些最大版本的词典?合并词典数组

data1 = [{'id': 1, 'name': 'Oneeee', 'version': 2}, 
     {'id': 2, 'name': 'Two', 'version': 1}, 
     {'id': 3, 'name': 'Three', 'version': 2}, 
     {'id': 4, 'name': 'Four', 'version': 1}, 
     {'id': 5, 'name': 'Five', 'version': 1}] 

data2 = [{'id': 1, 'name': 'One', 'version': 1}, 
     {'id': 2, 'name': 'Two', 'version': 1}, 
     {'id': 3, 'name': 'Threeee', 'version': 3}, 
     {'id': 6, 'name': 'Six', 'version': 2}] 

合并结果应该是这样的:

data3 = [{'id': 1, 'name': 'Oneeee', 'version': 2}, 
     {'id': 2, 'name': 'Two', 'version': 1}, 
     {'id': 3, 'name': 'Threeee', 'version': 3}, 
     {'id': 4, 'name': 'Four', 'version': 1}, 
     {'id': 5, 'name': 'Five', 'version': 1}, 
     {'id': 6, 'name': 'Six', 'version': 2}] 
+5

你试过*什么*? – Crono

+2

字典在哪里?我只能看到两个JSON数组 –

+4

'key:value'不是c#字典格式,它是'{key,value}' – Sam

回答

1

如何了解以下信息:

//define data1 and Data2 
var data1 = new[]{ 
        new {id = 1, name = "Oneeee", version = 2}, 
        new {id = 2, name = "Two", version = 1}, 
        new {id = 3, name = "Three", version = 2}, 
        new {id = 4, name = "Four", version = 1}, 
        new {id = 5, name ="Five", version = 1} 
       }; 

var data2 = new[] { 
        new {id = 1, name = "One", version = 1}, 
        new {id = 2, name = "Two", version = 1}, 
        new {id = 3, name = "Threeee", version = 3}, 
        new {id = 6, name = "Six", version = 2} 
       }; 
//create a dictionary to handle lookups  
var dict1 = data1.ToDictionary (k => k.id); 
var dict2 = data2.ToDictionary (k => k.id); 

// now query the data 
var q = from k in dict1.Keys.Union(dict2.Keys) 
     select 
       dict1.ContainsKey(k) ? 
        (
        dict2.ContainsKey(k) ? 
        (
         dict1[k].version > dict2[k].version ? dict1[k] : dict2[k] 
        ) : 
        dict1[k] 
       ) : 
        dict2[k]; 

// convert enumerable back to array 
var result = q.ToArray(); 

替代解决方案,数据库友好,如果DATA1和DATA2为表....

var q = (
      from d1 in data1 
      join d2 in data2 on d1.id equals d2.id into data2j 
      from d2j in data2j.DefaultIfEmpty() 
      where d2j == null || d1.version >= d2j.version 
      select d1 
     ).Union(
      from d2 in data2 
      join d1 in data1 on d2.id equals d1.id into data1j 
      from d1j in data1j.DefaultIfEmpty() 
      where d1j == null || d2.version > d1j.version 
      select d2 
     ); 

    var result = q.ToArray(); 
0

假设你有一些类像(JSON.NET属性这里使用):

public class Data 
{ 
    [JsonProperty("id")] 
    public int Id { get; set; } 
    [JsonProperty("name")] 
    public string Name { get; set; } 
    [JsonProperty("version")] 
    public int Version { get; set; } 
} 

您可以分析你JSON转换为此Data对象的数组:

var str1 = @"[{'id': 1, 'name': 'Oneeee', 'version': 2}, 
       {'id': 2, 'name': 'Two', 'version': 1}, 
       {'id': 3, 'name': 'Three', 'version': 2}, 
       {'id': 4, 'name': 'Four', 'version': 1}, 
       {'id': 5, 'name': 'Five', 'version': 1}]"; 

var str2 = @"[{'id': 1, 'name': 'One', 'version': 1}, 
       {'id': 2, 'name': 'Two', 'version': 1}, 
       {'id': 3, 'name': 'Threeee', 'version': 3}, 
       {'id': 6, 'name': 'Six', 'version': 2}]"; 

var data1 = JsonConvert.DeserializeObject<Data[]>(str1); 
var data2 = JsonConvert.DeserializeObject<Data[]>(str2); 

所以,你可以通过ID Concat的这两个数组,组数据项,并从具有最高版本每个组项目中进行选择:

var data3 = data1.Concat(data2) 
       .GroupBy(d => d.Id) 
       .Select(g => g.OrderByDescending(d => d.Version).First()) 
       .ToArray(); // or ToDictionary(d => d.Id) 

结果(连载回JSON):

[ 
    { "id": 1, "name": "Oneeee", "version": 2 }, 
    { "id": 2, "name": "Two", "version": 1 }, 
    { "id": 3, "name": "Threeee", "version": 3 }, 
    { "id": 4, "name": "Four", "version": 1 }, 
    { "id": 5, "name": "Five", "version": 1 }, 
    { "id": 6, "name": "Six", "version": 2 } 
] 
+0

Downvoter,我会解释我的解决方案有什么问题 –