在c#的多列上按结构列表分组
本文关键字:结构 列表 | 更新日期: 2023-09-27 18:08:31
我有一个结构体
public struct structMailJob
{
public string ID;
public string MailID;
public int ResendCount;
public int PageCount;
}
和一个列表作为
List<structMailJob> myStructList = new List<structMailJob>();
我已经加载了数据在myStructList从数据库,并希望myStructList数据在一个新的列表分组后的MailID和ResendCount。
我正在尝试:
List<structMailJob> newStructList = new List<structMailJob>();
newStructList = myStructList.GroupBy(u => u.MailID, u=>u.ResendCount)
.Select(grp => new { myStructList = grp.ToList() })
.ToList();
但是无法这样做,因为得到错误消息- 不能隐式地将泛型列表转换为structMailJob.
我想你要找的是以下内容:
var newStructList = myStructList.GroupBy(smj => new { smj.MailID, smj.ResendCount })
.Select(grp => new
{
MailID = grp.Key.MailID,
ResendCount = grp.Key.ResendCount
MailJobs = grp.Select(x=>new
{
x.ID,
x.PageCount
}).ToList()
})
.ToList();
注意,我们将GroupBy
子句更改为以下子句:
GroupBy(smj => new { smj.MailID, smj.ResendCount })
这样做,将在其上创建组的密钥将由MailID
和ResendCount
组成。顺便说一下,前面的GroupBy
条款是不正确的。
然后完成分组,我们将每个组投影到一个具有三个属性的对象,MailID
和ResendCout
,它们是具有两个属性ID
和PageCount
的匿名类型对象的键和列表的组件,我们将其命名为MailJobs。
最后但并非最不重要的是,你会注意到我没有提到以下
List<structMailJob> newStructList = new List<structMailJob>();
我只是使用了var
并声明了newStructList
。我不认为你在你的帖子中所说的有意义。我们如何期望在分组之后得到相同对象的列表?所以我假设您可能想要的是上面的。
然而,我想你可能也想要这样的东西,你不想引用Grouping。
myStructList = myStructList.OrderBy(smj => smj.MailID)
.ThenBy(smj => smj.ResendCount)
.ToList();
Linq Query是完全错误的,以下是要点:
myStructList.GroupBy(u => u.MailID, u=>u.ResendCount)
//分组错误
myStructList.GroupBy(u => new {u.MailID, u.ResendCount })
//正确的分组,这将由两列MailID
和ResendCount
完成,最后一个只由MailID
完成,并使用ResendCount
进行结果投影
现在结果是IEnumerable<IGrouping<AnonymousType,structMailJob>>
类型,所以当你做Select
之类的事情时,它最终会创建IEnumerable<List<structMailJob>>
类型的concatated List(在Select中删除了对myStructList
的赋值,因为这是不正确的):
.Select(grp => grp.ToList())
正确的代码将要求您使用SelectMany
平化,如下所示:
newStructList = myStructList.GroupBy(u => new {u.MailID, u.ResendCount})
.SelectMany(grp => grp.ToList()).ToList();
将其分配给newStructList
,但此代码几乎没有什么用途,因为字面上newStructList
与myStructList
在平坦后完全相同,理想情况下,您应该能够使用分组,以便您可以获得一个子集,从而获得正确的结果,但这取决于您的业务逻辑
我不知道我的问题是否正确,但我觉得你似乎错过了Group by的签名。
List<structMailJob> myStructList = new List<structMailJob>();
List<structMailJob> newStructList = new List<structMailJob>();
newStructList = myStructList
// .GroupBy(/*Key Selector */u => u.MailID, /*Element Selector*/u=>u.ResendCount)
.GroupBy(u => new { u.MailID, u.ResendCount }) // broup by MailID, ResendCount
// Note no Element Selector , the 'STRUCT' is 'SELECTED'
.Select(grp => {
// NOte: Key == Anonymous {MailID, ResendCount }
return grp;
})
// otherwise you get a IEnumerable<IEnumerable<T>> instead of IEnumerable<T> because you grouped it
.SelectMany(x=>x)
.ToList();
如果您正在寻找Mrinal Kamboj的答案,那么您可以使用以下选项作为替代:
var orderedList = myStructList.OrderBy(x => x.MailID).ThenBy(x => x.ResendCount);