需要每个孩子记录的消息大小



我有一个以下LINQ查询,我想从Master数据中选择填充child数据,而且我也想计算大小。

this.Size = JsonConvert.SerializeObject(Child).Length;

这是查询和主数据,

var mast = new List<Master>
{
    new Master{Id=1, Name="Name1"},
    new Master{Id=2, Name="Name1"},
    new Master{Id=3, Name="Name11"},
    new Master{Id=4, Name="Name11"},
};
var g = from data in mast
        group data by new { data.Name } into T
        select new Message(T.Select(t => new Child
        {
            Name = t.Name
        }).ToList());

和支持课,

public class Master
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Child
{
    public string Name { get; set; }
}
public class Message
{
    public Child Child { get; set; }
    public int Size { get; set; }
    public Message(Child Child)
    {
        this.Child = Child;
        this.Size = JsonConvert.SerializeObject(Child).Length;
    }
}

当前在列表和单个项目之间的铸造问题下遇到错误,

select new Message(T.Select(t => new Child
                    {
                        Name = t.Name
                    }).ToList());

不能从'system.collections.generic.list'转换为'testapp.child'testapp

在这里需要做什么?谢谢!

编辑:我要实现的最终结果是List<List<Message>>,其中内部List<Message>按名称分组;因此,根据我的示例数据,将有2个Message s列表,每个列表包含2个项目:

  • 清单1:
    • 消息:名称:名称1,大小16
    • 消息:名称:名称1,大小16
  • 清单2:
    • 消息:名称:名称11,大小17
    • 消息:名称:名称11,大小17

您错过了对FirstOrDefault的呼叫,该电话将通过T.Select返回的IEnumerable<Child>返回到Message构造函数。

您的ToList调用也位于错误的位置 - 当您真正想要List<Message>时,您只是将IEnumerable<Child>转换为List<Child>,在创建每个Message之后。

更改为:

var g = (from data in mast
        group data by new { data.Name } into T
        select new Message(T.Select(t => new Child
        {
            Name = t.Name
        }).FirstOrDefault())).ToList();

edit :我认为您担心FirstOrDefault仅返回1个值 - 但是,请记住,这是1 Child per name ,因为您只是分组他们用名字 - 正是您想要的。最终List<Message>包含带有大小的唯一名称。

编辑2.0 :好的,基于您自己的答案,这阐明了您的问题,我认为此查询将更好地满足您的需求:

var messages = mast.GroupBy(m => m.Name)
                    .Select(nameGroup => Enumerable.Repeat(
                        new Message(new Child() { Name = nameGroup.Key }), nameGroup.Count()).ToList()
                    ).ToList();

以上将产生一个List<List<Message>>,按名称分组(但保留原始消息数),并且每条消息都将计算Size属性。

最新更新