1

我有一个包含以下内容的消息结构

DateTime dateIn;
long? messageId;
string messageContent;

我正在尝试根据 messageId 对我的消息列表进行分组,并按 dateIn 字段排序。

我的 LINQ 目前看起来像这样

var groups = from c in MessageList 
            let name = c.messageId
                orderby name ascending, c.dateIn ascending
                group c by name into g
                select g;

当我尝试将其反馈到新的 List<Messages> 时,编译器会返回

“无法将 System.Collections.Generic.List<System.Linq.IGrouping<long?,Messages>> 类型隐式转换为 System.Collections.Generic.List<Messages>”

问题是长期的吗?比什么都重要?我试图将 messageId 转换为 long,但这似乎也不起作用。

4

2 回答 2

2

我想您可以使用 SelectMany 从分组的消息集合中对您的消息集合进行环绕(如果我理解您是正确的):

List<Messages> back = groups.SelectMany(m=>m.ToList()).ToList();

更新

根据你的评论。当您使用GroupBy - Linq 创建新的泛型类型的 Enumerable 结合您的集合类型和键类型,用于分组。在您的情况下,它是 Messages 类型并且很长?(messageId 的类型 - 键,您分组的依据)。所以这应该适合你:

List<long?,Messages> grouped = groups.ToList();

或者您可以使用var这也应该有效:

var grouped = groups.ToList();
于 2013-05-17T11:48:36.270 回答
1

如果我了解您要做什么,则有更简单的方法。看我的演示:

public class Program
{
    static void Main(string[] args)
    {
        List<Message> MessageList = new List<Message>()
        {
            new Message(){ dateIn = new DateTime(2000,1,11)},
            new Message(){ dateIn = new DateTime(2000,1,9)},
            new Message(){ dateIn = new DateTime(2000,1,8), messageId = 5},
            new Message(){ dateIn = new DateTime(2000,1,12)},
            new Message(){ dateIn = new DateTime(2000,1,2), messageId = 7}
        };

        foreach (var item in MessageList)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine("===");

        // MUCH SIMPLER
        var result = MessageList
            .GroupBy(m => m.messageId)
            .SelectMany(m => m.ToList())
            .OrderBy(m => m.dateIn);

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }

        Console.ReadLine();
    }
}

struct Message
{
    public DateTime dateIn { get; set; }
    public long? messageId { get; set; }
    public string messageContent { get; set; }

    public override string ToString()
    {
        return messageId + "\t" + dateIn;
    }
}
于 2013-05-17T11:57:17.073 回答