C#组列表到新列表

时间:2018-08-09 04:18:22

标签: c# linq

我遇到一个问题,无法对列表进行分组,我进行了研究并尝试了不同的方法,但结果不是我想要的。我不确定自己做错了什么。

List<NewSomeGroup> newsomegourplist = new List<NewSomeGroup>();
var query = from c in _someRepository.Table
                            where  c.isRead == false
                            group c by c.ReferenceId into grpdlist
                            orderby grpdlist.Key
                            select grpdlist;

foreach (var grpdlist in query)
{
    NewSomeGroup somegroup = new NewSomeGroup();
    List<Some> somelist = new List<Some>();
    somegroup.ReferenceId = grpdlist.Key;
    foreach (var item in grpdlist) // not in
    {
        somelist.Add(item);
    }
    somegroup.somecontainlist = somelist;
    newsomegourplist.Add(somegroup);
}

最后somegroup的{​​{1}}正确,但是ReferenceId的对象为空。我非常确定它在数据库中有数据,我也尝试在localhost中进行调试,发现somecontainlist没有添加//not in

数据结构

item

2 个答案:

答案 0 :(得分:0)

A,您没有指定Table,所以我必须从您的代码中提取规范:

输入是Table行,其中每一行都是一个至少具有布尔属性IsRead和属性ReferenceId的对象。

此外,似乎每一行都类似于Some。行不等于Some,因为行具有属性IsRead,而行Some不具有此属性。

这可能是键入错误,或者行可能是来自Some派生类的对象。由于您没有指定表,因此我假设后者。

表中的行不必是相同类型的对象,但是它们至少是从Some

派生的

您希望所有尚未读取的行都分组为具有相同ReferenceId的行。您希望将每个组转换为一个NewSomeGroup对象,其中ReferenceId是组中元素的公用ReferenceId,而SbNotificationList是一个列表,其中每个元素包含组中行的Some值。

我对方法语法更加熟悉(它具有更多功能),所以我的答案将是方法语法:

var result = myRepository.Table           // from every row in the Table
    .Where(row => !row.IsRead)            // take only those that are not read
    .GroupBy(row => row.ReferenceId)      // make groups of rows with equal ReferenceId
    .Select(group => new NewSomeGroup()   // from every group make one NewSomeGroup object
    {
         ReferenceId = group.Key,
         SbNotificationList = group       // from the sequence of rows in the group
             .Cast<Some>()                // cast every row to a Some
             .ToList(),                   // and put it in a list
    })
    .OrderBy(item => item.ReferenceId);

仅当您完全确定表中的每一行确实是Some时,此方法才有效。

这是最有效的,因为您的行没有被复制;参考资料将放入您的最终结果中。换句话说:您的最终结果包含原始行。

但是,如果您更改SbNotificationList元素的属性值,则原始行将更改。

如果您不希望这样做,或者某些行不是Some,则必须使用行中的值创建新的Some对象:

.GroupBy(row => row.ReferenceId)
.Select(group => new NewSomeGroup() 
{
    ReferenceId = group.Key,
    SbNotificationList = group       // from the rows in the group make one list
        .Select(row => new Some()    // where every row becomes one Some object
        {
            Title = row.Title,
            ProjectId = row.ProjectId,
            ...
            CreateOnUtc = row.CreateOnUtc, 
         })
         .ToList(),
})
.OrderBy(item => item.ReferenceId);

无论选择哪种方法,如果输入表为空或没有未读的行,则结果仍将是NewSomeGroup对象的序列,但是此序列将为空(这有所不同)比null!)。

如果输入表中有一个或多个被读取的行,则结果将不会为空。结果中的每个NewSomeGroup都会有一个非空的SbNotificationList,其中包含Some等于{{1}的ReferenceId的所有行的ReferenceId值}对象。

很难说,最终结果中的任何NewSomeGroup对象都没有空的NewSomeGroup。您可以在此SbNotificationList

答案 1 :(得分:0)

您可以尝试以下代码:

somegroup.somecontainlist.AddRange(somelist);

或者您可以尝试以下操作:

somegroup.somecontainlist = new List<SomeDataType>(somelist);

或者如果您在Linq中使用C#3和.NET 3.5,则可以执行以下操作:

somegroup.somecontainlist = somelist.ToList();