2015-06-16 2 views
3

У меня есть два объекта «псевдотип» Hash (int key, list values), которые мне нужно объединить в один на основе ключа. Например,Объединение двух коллекций в C# или JavaScript

[{1, {a, b, c}}, 
{2, {apple, pear}}, 
{3, {blue, red}}] 

и

[{2, {tomato}}, 
{3, {pink, red}}, 
{4, {x, y, z}}] 

В результате, что мне нужно:

[{1, {a, b, c}}, 
{2, {apple, pear, tomato}}, 
{3, {blue, red, pink, red}}, 
{4, {x, y, z}}] 

(JSON-подобный формат для удобства чтения)

я могу сделать это сервер (C#) или на клиенте (Javascript/Angular). Есть ли тип агрегата в C#, который имеет метод, который бы это сделал? Или, может быть, какое-то мастерское выражение LINQ, которое делает то же самое?

Или лучший способ иметь их как Hashtable<int, List<object>>, и присоединиться к ним «вручную»?

UPDATE: На основе ниже ответ, это лучший способ, чтобы задать вопрос:

 Dictionary<int, string[]> Dict1 = new Dictionary<int, string[]>(); 
     Dict1.Add(1, new string[] { "a", "b", "c" }); 
     Dict1.Add(2, new string[] { "apple", "pear" }); 
     Dict1.Add(3, new string[] { "blue", "red" }); 
     Dictionary<int, string[]> Dict2 = new Dictionary<int, string[]>(); 
     Dict2.Add(2, new string[] { "tomato" }); 
     Dict2.Add(3, new string[] { "pink", "red" }); 
     Dict2.Add(4, new string[] { "x", "y", "z" }); 

     foreach (var item in Dict2) { 
      if (Dict1.ContainsKey(item.Key)) { 
       Dict1[item.Key] = Dict1[item.Key].Concat(item.Value).ToArray(); 
      } else { 
       Dict1.Add(item.Key, item.Value); 
      } 
     } 

Есть ли какой-то тип Collection, который позволил бы мне присоединиться к двум объектам, вместо того, чтобы идти через петлю?

+0

Что вы имеете в виду ' {a, b, c} '? Должен ли он быть массивом '[a, b, c]'? Или вы имеете в виду объект a {a: somevalue, b: somevalue, c: somevalue} –

+0

Да, я должен был бы поставить [] (я вырезал и вставил из 'object [] x = новый объект [] {a, b, c} '. Но я могу сделать это в любом случае, если есть ограничения ... – Felix

ответ

1

Есть несколько способов, как вы можете это достичь, я предполагаю, что вы хотите использовать json-файл в качестве исходного файла, поэтому почему бы не преобразовать все в объекты и не справиться с ними таким образом, что обеспечит большую гибкость манипулировать ими и выполнять дополнительную обработку осложнений, если это необходимо.

Вот мой проект версии:

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 

     List<JsonModel> ListJson1 = new List<JsonModel>(); 
     ListJson1.Add(new JsonModel(1, new List<string>(new string[] {"a", "b", "c"}))); 
     ListJson1.Add(new JsonModel(2, new List<string>(new string[] {"apple", "pear"}))); 
     ListJson1.Add(new JsonModel(3, new List<string>(new string[] {"blue", "red"}))); 

     List<JsonModel> ListJson2 = new List<JsonModel>(); 
     ListJson2.Add(new JsonModel(2, new List<string>(new string[] {"tomato"}))); 
     ListJson2.Add(new JsonModel(3, new List<string>(new string[] {"pink", "red"}))); 
     ListJson2.Add(new JsonModel(4, new List<string>(new string[] {"x", "y", "z"}))); 

     List<JsonModel> result = ListJson1.Concat(ListJson2) 
           .ToLookup(p => p.Index) 
           .Select(g => g.Aggregate((p1,p2) => 
                 new JsonModel(p1.Index,p1.Names.Union(p2.Names)))).ToList(); 

     foreach(var item in result) 
     { 
     Console.WriteLine(item.Index); 
      foreach(var Item in item.Names) 
       Console.WriteLine(Item); 
     } 
    } 


} 


public class JsonModel 
    { 
     public int Index;//you can use your private set and public get here 
     public IEnumerable<string> Names;//you can use your private set and public get here 

     public JsonModel(int index, IEnumerable<string> names) 
     { 
     Index = index; 
     Names = names; 
     } 

    } 

выход: 1 а 2 яблока груша помидоры 3 синих красные розовые 4 хуга

Проверить это link из

+0

Я смотрю на вашу скрипку - кажется, что значения из второго словаря не добавляются ... Fro пример, когда' key = 1', значения - «яблоко» и «груша», а не «помидор». Я что-то не хватает? – Felix

+0

GroupBy дает KeyValuePair >, поэтому та же проблема просто попадает в результаты GroupBy – Felix

+0

@Felix проверить это –

Смежные вопросы