2013-05-17 45 views
1

我有一个包含以下分组和排序使用LINQ

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; 

当我尝试并反馈到一个新的列表<消息>,编译回来与

“无法隐式转换类型系统。 Collections.Generic.List < System.Linq.IGrouping < long?,Messages >>>至 System.Collections.Generic.List <消息>“

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

+1

“当我尝试将它反馈回新的列表< Messages>”,你是如何做到这一点,你可以告诉我们的代码? –

+0

我假设你没有在'groups'上向我们展示'ToList()'调用。你为什么希望消息组的列表可分配给代表消息平面列表的类型? – Ani

+0

我正在使用列表 grouped = groups.ToList();将其分配给新组。不包括这一点的道歉。 – Nodoid

回答

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; 
    } 
} 
+0

谢谢 - 令人惊讶的是LINQ真的可以做什么! – Nodoid

2

我想你可以使用到的SelectMany从分组的一个orbitaine您的留言集合(如果我理解你正确):

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

修订

根据您的意见。当您使用GroupBy - Linq创建新的泛型类型的Enumerable,将您用于分组的集合类型和键类型组合起来。你的情况是消息类型和长? (messageId - 键的类型,您正在分组)。因此,这应该为你工作:

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

或者你可以使用VAR,这也应该工作:

var grouped = groups.ToList();