2013-07-23 3 views
2

У меня есть список ChannelsКак я могу развернуть этот список объектов?

var blocks = new List<Block>(); 
foreach (var channel in ChannelsCollection) 
{ 
    var ch = channel.ChannelCollectionItems.Select(item => new Channel 
    { 
     Id = channel.Id, 
     Delay = item.Delay, 
     Trigger = item.Trigger, 
     Restore = item.Restore, 
    }).ToList(); 

    blocks.Add(new Block { Id = index++ , Channels = ch}); 
} 

Это приводит список Blocks, каждый из которых содержит список Channels.

например.

Block1   Block2   Block3   Block4 
    Channel1  Channel1  Channel1  Channel1 
     Val1   Val1   Val1   Val1 
     Val2   Val2   Val2   Val2 
     Val3   Val3   Val3   Val3 
    Channel2  Channel2  Channel2  Channel2 
     Val1   Val1   Val1   Val1 
     Val2   Val2   Val2   Val2 
     Val3   Val3   Val3   Val3 
    Channel3  Channel3  Channel3  Channel3 
     Val1   Val1   Val1   Val1 
     Val2   Val2   Val2   Val2 
     Val3   Val3   Val3   Val3 

Мне нужно повернуть этот список, так что у меня есть список Channels, которые содержат каждый Block для этого канала.

например.

Channel1  
    Block1  Block2  Block3   
     Val1   Val1   Val1 
     Val2   Val2   Val2 
     Val3   Val3   Val3 

Channel2 
    Block1  Block2  Block3   
     Val1   Val1   Val1 
     Val2   Val2   Val2 
     Val3   Val3   Val3    

Channel3 
    Block1  Block2  Block3   
     Val1   Val1   Val1 
     Val2   Val2   Val2 
     Val3   Val3   Val3   

Есть ли быстрый способ (например, LINQ) сделать это?

Редактировать

Channel и Block определяются как:

public class Channel 
{ 
    public int? Id { get; set; } 
    public string Delay { get; set; } 
    public string Trigger { get; set; } 
    public string Restore { get; set; } 
} 

public class Block 
{ 
    public int Id { get; set; } 
    public List<Channel> Channels { get; set; } 
} 
+1

Не могли бы вы опубликовать свой канал и ваш класс блок? –

+0

Я добавил их. Благодарю. – DaveDev

+1

Есть ли у канала свойство Block Collection? –

ответ

0

Это оказалось решение:

public class ChannelRowCell 
{ 
    public string Name { get; set; } 
    public string Delay { get; set; } 
    public string Trigger { get; set; } 
    public string Restore { get; set; } 
} 

public class ChannelRow 
{ 
    public int Id { get; set; } 
    public List<ChannelRowCell> Cells { get; set; } 
} 

public static class DigiChannelsExtensions 
{ 

    public static List<ChannelRow> GetRows(this List<DigiChannelsVM> digiChannelsVms) 
    { 
     var blocks = (from vm in digiChannelsVms 
         let ch = vm.ChannelCollectionItems.Select(item => new 
         { 
          vm.Id, 
          Type = item.Types.EnumDataItems.FirstOrDefault(xx => xx.IsSet).Description, 
          Delay = item.Delay.Value.ToString(), 
          Trigger = item.Trigger.Value == 0 ? "+" : "-", 
          Restore = item.Restore.GetSelectedEnumItems().FirstOrDefault().Description == "Restore" ? "Y" : "N", 
         }).ToList() 
         select new { Id = vm.Id.Value, Channels = ch }).ToList(); 

     var channelRows = new List<ChannelRow>(); 
     //for (var i = 0; i < blocks[0].Channels.Count; i++) 
     for (var i = 0; i < blocks[0].Channels.Count; i++) 
     { 
      var channelRow = new ChannelRow { Cells = new List<ChannelRowCell>(), Id = i+1 }; 
      foreach (var cc in blocks.Select(block => block.Channels[i])) 
      { 
       channelRow.Cells.Add(new ChannelRowCell 
       { 
        Delay = cc.Delay, 
        Name = cc.Type, 
        Restore = cc.Restore, 
        Trigger = cc.Trigger, 
       }); 
      } 

      channelRows.Add(channelRow); 
     } 

     return channelRows; 
    } 
} 
1

Попробуйте это:

var r = blocks 
    .GroupBy(b => b.Channels.Select(c => c)) 
    .Select(g => new { Channel = g.Key, Blocks = g.Select(b1 => b1) }); 
+0

Я не уверен, что это то, что вы хотите - это примерно аналогично «var r = blocks.Select (b => new {Channel = b.Channels.AsEnumerable(), Blocks = Enumerable.Repeat (b, 1)}); ' – Rawling

2

Попробуйте что-то вроде

var channels = blocks 
    .SelectMany(b => b.Channels.Select(c => new { b, c })) 
    .GroupBy(p => p.c.Id) 
    .Select(g => new { Channel = g.First().c, Blocks = g.Select(p => p.b) }); 

Как уже отмечалось, ваш Channel класс не где-нибудь, чтобы сохранить последовательность Block с, так что это возвращает последовательность анонимных объектов с Channel под названием Channel и IEnumerable<Block> под названием Blocks.

Обратите внимание, что он также сравнивает Channel s по Id, так как они не выглядят сопоставимыми в противном случае. Если ваш Channel s несовместим между Block s, это просто принимает Channel с первых Block.

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