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