2013-05-17 39 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();