2015-03-31 128 views
-1

我有這樣一個模型:尋求優雅的LINQ解決方案

public class Post 
{ 
    public int PostId, 
    public List<Category> Categories 
} 

帖子至少有1類,也可以有很多種類。

我有一個列表,此列表包含帖子(一些具有相同的PostId),並且列表中的每個條目都包含一個唯一的類別(每個類別的Categories.Count = 1)。

我想創建一個只有不同的帖子(獨特的PostId)的新列表,其中與原始列表中的每個類別填充的類別列表具有相同的PostId。

基本上,找到原始列表中的每個帖子,並通過將他們的第一個(也是唯一)條目添加到他們的Categories字段中來填充Categories字段。

linq有沒有一個很好的解決方案?

分類只是一個枚舉,

我一直在使用varous嵌套的foreach嘗試和for循環和它的作品,但它僅僅是毛。我知道有一個乾淨的方法來做到這一點。

實施例:

關鍵字= {帖子ID = 1,類別=購物},{帖子ID = 1,類別=披薩},{帖子ID = 2,類別=洗衣}

後序列所需的輸出到是:

分類= {=帖子ID 1,類別=購物,比薩},{=帖子ID 2,類別=洗衣}

順序無所謂的類別列表

+1

什麼是'Category'的定義是什麼?你能提供任何樣本輸入\輸出,最重要的是你已經嘗試過嗎? – 2015-03-31 05:41:15

回答

0

既然你將有平均每個職位(如第二款規定)只有一類,你可以嘗試

var result = aPosts 
    .GroupBy(item => item.PostId, item => item.Categories[0]) 
    .Select(group => new Post() { PostId = group.Key, Categories = new List<Category>(group) }) 
    .ToList(); 

注意,具有同時接受帖子ID和類別的相關帖子的構造將允許更簡化任何解決方案的版本。

Post(int postId, IEnumerable<Category> categories) 
{ 
    PostId = postId; 
    Categories = new List<Category>(categories); 
} 

將允許以下:

var result = aPosts 
    .GroupBy(item => item.PostId, item => item.Categories[0]) 
    .Select(group => new Post(group.Key, group)) 
    .ToList(); 
0

類似下面

var result = yourlist.GroupBy(l=>l.PostId) 
       .Select(x=>new Post{ PostId =x.Key, Categories =x.SelectMany(y=>y.Categories).ToList()}) 
       .ToList(); 
0

隨着LINQ表達式:

var result = from o in posts 
group o by o.PostID into gr 
select new Post 
{ 
    PostID = gr.Key, 
    Categories = gr.SelectMany(c=>c.Categories).ToList() 
}; 
0

所有其他給定的解決方案是可行的。但是,如果您的類別列表中可能有多個類別,並且您只需要每個帖子的第一個,則可以使用以下內容。

var posts = 
       postList.GroupBy(p => p.PostId) 
         .Select(
          g => 
          new Post 
           { 
            PostId = g.Key, 
            Categories = 
             g.Select(p => p.Categories.FirstOrDefault()) 
             .Where(c => c != null).ToList() 
           }); 

另外,請確保您在使用答案中給出的Linq之前初始化您的Categories屬性(例如在Post類的構造函數中)。否則,你可能會得到NUllReferenceException