在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.

在c#的多列上按结构列表分组

我想你要找的是以下内容:

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

这样做,将在其上创建组的密钥将由MailIDResendCount组成。顺便说一下,前面的GroupBy条款是不正确的。

然后完成分组,我们将每个组投影到一个具有三个属性的对象,MailIDResendCout,它们是具有两个属性IDPageCount的匿名类型对象的键和列表的组件,我们将其命名为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 })//正确的分组,这将由两列MailIDResendCount完成,最后一个只由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,但此代码几乎没有什么用途,因为字面上newStructListmyStructList在平坦后完全相同,理想情况下,您应该能够使用分组,以便您可以获得一个子集,从而获得正确的结果,但这取决于您的业务逻辑

我不知道我的问题是否正确,但我觉得你似乎错过了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);