2014-02-17 2 views
1

У меня есть список с некоторыми записями, некоторые из которых имеют одинаковый идентификатор записи. Я хочу сгруппировать по этому идентификатору записи, а остальные свойства - списки и некоторые строки. Это объект, который я надеюсь создать:GroupBy свойство, сделать список повторяющихся

public class Product { 
    public string Id{ get; set; } 
    public List<string> Package { get; set; } 
    public string ShortDescription { get; set; } 
} 

И записи я хочу обрабатывать приходят так:

list_Of_Records = [ { id: 123, Package: ABC, ShortDescription: Description }, 
        { id: 123, Package: ZXY, ShortDescription: Description }, 
        { id: 123, Package: MLO, ShortDescription: Description }, 
        { id: 456, Package: ABC, ShortDescription: DescriptionTwo }, 
        { id: 456, Package: ZXY, ShortDescription: DescriptionTwo }, 
        { id: 456, Package: MLO, ShortDescription: DescriptionTwo }, 
] 

И Я бы хотел, чтобы выглядеть примерно так:

list_Of_Records_Organized = [ 
     { Id: 123, Package: [ABC, ZXY, MLO], ShortDescription: Description }, 
     { Id: 456, Package: [ABC, ZXY, MLO], ShortDescription: DescriptionTwo } 
] 

Описание всегда одинаково для каждого идентификатора, поэтому я могу взять любой из трех. Проблема в том, что эти пакеты!

Надеюсь, что я достаточно ясен.

ответ

3

попробовать что-то вроде этого:

var list_Of_Records_Organized = 
    from r in list_Of_Records 
    group r by r.Id into g 
    select new Product { 
     Id = g.Key, 
     Package = g.Select(r => r.Package).ToList(), 
     ShortDescription = g.First().ShortDescription 
    }; 

Или в синтаксисе лямбда:

var list_Of_Records_Organized = list_Of_Records.GroupBy(
    r => r.Id, 
    (k, g) => new Product { 
     Id = k, 
     Package = g.Select(r => r.Package).ToList(), 
     ShortDescription = g.First().ShortDescription 
    }); 
+0

Спасибо! Это работает! Пришлось изменить SelectMany на Select и добавить ToList, но отлично работает. –

+0

@fede_rosario Извините, я неправильно понял. Я думал, что 'r.Package' был' List '. Я соответствующим образом обновил ответ. –

+0

Да, я сделал то же самое. Если бы идея состояла в том, чтобы иметь список , а затем новый список с групповыми значениями пакета, тогда пакет должен быть списком и SelectMany. Я написал один и тот же запрос, но не публиковал сообщения, так как этот ответ отлично справляется с этим. –

3
organizedList = list_of_records 
       .GroupBy(m => m.id) 
       .Select(m => new { 
        Id = m.Key, 
        Package = m.SelectMany(x => x.Package).ToArray(), 
        ShortDescription = m.First().ShortDescription 
       }); 

Но это означает, что вы будете принимать произвольное SHORTDESCRIPTION (первая находится в каждой группе).

Кстати, ваш образец не ясен.

Является ли пакет строкой или списком строк? В вашем классе это List<string>, но в вашем примере это выглядит как строка.

, если это строка, используйте Select вместо SelectMany в

Package = m.Select(x => x.Package).ToArray(), 
+0

Да, его список, извините за это. Оба ответа работают, отмечая тот, который я пробовал в первую очередь. –

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