2016-10-21 3 views
-1

Привет Я пытаюсь использовать LINQ для группировки некоторых данных, которые я получил. Данные:Группа по ID в объекте List

[ 
    { 
    "TicketID": 11, 
    "Priority": 1, 
    "Email": "[email protected]",   
    "Files": [ 
     { 
     "FileID": 1, 
     "FileName": "file1.png" 
     } 
    ] 
    }, 
    { 
    "TicketID": 11, 
    "Priority": 1, 
    "Email": "[email protected]",   
    "Files": [ 
     { 
     "FileID": 2, 
     "FileName": "file2.png" 
     } 
    ] 
    }, 
    { 
    "TicketID": 11, 
    "Priority": 1, 
    "Email": "[email protected]",   
    "Files": [ 
     { 
     "FileID": 3, 
     "FileName": "file3.png" 
     } 
    ] 
    }, 
] 

Можно сгруппировать следующим образом:

[ 
    { 
    "TicketID": 11, 
    "Priority": 1, 
    "Email": "[email protected]",   
    "Files": [ 
     { 
     "FileID": 1, 
     "FileName": "file1.png" 
     }, 
     { 
     "FileID": 2, 
     "FileName": "file2.png" 
     }, 
     { 
     "FileID": 3, 
     "FileName": "file3.png" 
     } 
    ] 
    } 
] 

Я пытался использовать LINQ:

var newList = list.GroupBy(gb => gb.TicketID).SelectMany(s => s); 

Но это получает тот же результат, что и оригинал. Может быть, кто-то узнает. Спасибо!

+0

Вы можете посмотреть на [документацию] (https://msdn.microsoft.com/en-us/library/bb545971.aspx), которая имеет множество примеров того, как использовать 'GroupBy' ... –

+2

Правильно. Вы группируете группы по TicketID, а затем вы используете SelectMany, чтобы сгладить эти группы в одно перечисление снова. 's' - это объект' Group', который реализует 'IEnumerable'. Какая у вас была цель? Если вы просто хотите перечисление групп, избавитесь от 'SelectMany'; вы уже получили это с помощью GroupBy. –

+0

Можете ли вы предположить, что «Приоритет» и «Электронная почта» совпадают, если «TicketID» - то же самое? –

ответ

1

Предполагая TicketID, Email и Priority являются они ключи, с помощью которого вы хотите сгруппировать ваш массив, то вы можете сделать:

var groupedList = list.GroupBy(i => new 
{ 
    i.TicketID, 
    i.Priority, 
    i.Email 
}).Select(g => new Ticket() 
{ 
    TicketID = g.Key.TicketID, 
    Email = g.Key.Email, 
    Priority = g.Key.Priority, 
    Files = g.SelectMany(x => x.Files).ToList() 
}).ToList(); 

где Ticket класс, представляющий JSON в вашем примере.

0

Если у вас есть только один TicketID, то вы можете сделать это (назвать ваш SRC данные):

var tf = src.First(); 
var ans = new { TicketID = tf.TicketID, Priority = tf.Priority, Email = tf.Email, 
    Files = src.SelectMany(t => t.Files).ToArray() }; 

Если вы хотите работать с несколькими TicketIDs в своем ответе и объединить их TicketID, тогда как это:

var ans = src.GroupBy(t => t.TicketID).Select(
    gp => new { GP = gp, GPF = gp.First() }).Select(
     gpf => new { TickedID=gpf.GPF.TicketID, Priority = gpf.GPF.Priority, 
        Email = gpf.GPF.Email, 
        Files = gpf.GP.SelectMany(gp => gp.Files).ToArray() }).ToArray(); 

Первый выбор - это просто симулировать a, чтобы предотвратить повторение gp.First() для дублированных полей. Синтаксис запросов будет выглядеть следующим образом:

var ans = from t in src 
      group t by t.TicketID into gp 
      let gpf = gp.First() 
      select new { TicketID = gpf.TicketID, Priority = gpf.Priority, Email = gpf.Email, 
         Files = gp.SelectMany(gp => gp.Files).ToArray() }; 
Смежные вопросы