使用GroupBy对列表元素进行分组

时间:2014-10-02 08:17:08

标签: c# linq

对于我希望做的某些分组,我遇到一个LINQ表达式有点麻烦。 我有一个很大的列表,可能需要发送几千封邮件,我想把它们分成2000个邮件列表并将它们放入父列表中。 原始列表如下所示:List<Recipient>()

收件人有姓名,地址等。

我已经用foreach编写了我想做的事情,但是如果可能的话我希望将它作为LINQ表达式,我似乎无法理解它。

private List<List<Recipient>> PhysicalPageList(List<Recipient> recipients)
    {
        var pageList = new List<List<Recipient>>();
        var smallList = new List<Recipient>();
        foreach (var rec in recipients) 
        {
            smallList.Add(rec);
            if (smallList.Count % 2000 == 0) { continue; }
            var tmpList = new List<Recipient>();
            tmpList.AddRange(smallList);
            pageList.Add(smallList);
            smallList.Clear();
        }
        if (smallList.Count() != 0)
        {
            var tmpList = new List<Recipient>();
            tmpList.AddRange(smallList);
            pageList.Add(tmpList);
            smallList.Clear();
        }

        return pageList;
    }

我有一个关于字符串而不是收件人的例子(我自己没有写过):

    private List<List<string>> PageList(List<string> recipients)
    {
        return recipients.Select((x, i) => new { Index = i, Value = x })
                                        .GroupBy(x => x.Index / 2000) 
                                        .Select(x => x.Select(v => v.Value).ToList())
                                        .ToList();
    }

我尝试了同样的但LINQ不允许我从收件人列表中选择。

1 个答案:

答案 0 :(得分:1)

为什么你不尝试这个?

private List<List<Recipient>> PageList(List<Recipient> recipients)
{
    return recipients.Select((x, i) => new { Index = i, Value = x })
                     .GroupBy(x => x.Index / 2000) 
                     .Select(x => x.Select(v => v.Value).ToList())
                     .ToList();
}