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)来做到这一点?

编辑

ChannelBlock定义为:

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; }
}
4

3 回答 3

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类没有任何地方可以存储Blocks 序列,因此这将返回一个带有Channel被调用ChannelIEnumerable<Block>被调用的匿名对象序列Blocks

请注意,它还比较Channels by Id,因为它们似乎没有可比性。如果你Channel的 s 在 s 之间不一致Block,这只是Channel从第一个s 中获取Block

于 2013-07-23T11:34:57.993 回答
1

尝试这个:

var r = blocks
    .GroupBy(b => b.Channels.Select(c => c))
    .Select(g => new { Channel = g.Key, Blocks = g.Select(b1 => b1) });
于 2013-07-23T11:29:25.633 回答
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;
    }
}
于 2013-07-24T13:28:42.170 回答