Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#将列表分组为新列表_C#_Linq - Fatal编程技术网

c#将列表分组为新列表

c#将列表分组为新列表,c#,linq,C#,Linq,我面临一个无法将我的列表分组的问题,我做了研究并尝试了不同的方法,但结果不是我想要的。我不确定我是否做错了什么 List<NewSomeGroup> newsomegourplist = new List<NewSomeGroup>(); var query = from c in _someRepository.Table where c.isRead == false

我面临一个无法将我的列表分组的问题,我做了研究并尝试了不同的方法,但结果不是我想要的。我不确定我是否做错了什么

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

遗憾的是,您没有指定
,因此我必须从您的代码中提取规范:

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

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

这可能是键入错误,或者行可能是
Some
的派生类中的对象。由于您没有指定您的表,我将假定为后者

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

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

我更熟悉方法语法(除了它有更多的功能外),所以我的答案将是方法语法:

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);
无论选择哪种方法,如果输入表为空或没有未读取的行,结果仍然是
NewSomeGroup
对象序列,但是该序列将为空(这与null不同!)

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


要说最终结果中的任何
NewSomeGroup
对象都不可能有空的
SbNotificationList
,这是一种困难的方式。您可以
调试。在此上断言
您可以尝试以下代码:

somegroup.somecontainlist.AddRange(somelist);
或者您可以尝试以下方法:

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

如果第二个
foreach
循环未运行,则表示
grpdlist
没有任何项目。您可以通过执行`var count=grpdlist.count();`调试时检查
count
的值。@ChetanRanpariya我检查查询
c
是否有项,它只需要
c.ReferenceId
作为组键在代码中没有任何明显的东西可以解释这种行为。在这里,只有调试才有帮助。如果能够先执行
foreach
循环,则表示
query
中至少有一个groupItem。您还可以尝试直接从Sql Management Studio对数据库运行相同的查询,查看是否有任何数据返回structures@TheGeneral我添加了数据结构
somegroup.somecontainlist.AddRange(somelist);
somegroup.somecontainlist = new List<SomeDataType>(somelist);
somegroup.somecontainlist = somelist.ToList();