我有一个这样的模型:
public class Post
{
public int PostId,
public List<Category> Categories
}
帖子至少有一个类别,但也可以有很多类别。
我有一个List,这个列表包含Posts(一些具有相同的PostId),List中的每个条目都包含一个唯一的Category(Categories.Count = 1)。
我想创建一个只包含不同帖子(不同的PostId)的新列表,其中填充的类别列表包含原始列表中具有相同PostId的每个类别。
基本上,在原始列表中找到每个帖子,并通过在其“类别”字段中添加每个第一个(也是唯一一个)条目来填充“类别”字段。
在linq中有一个很好的解决方案吗?
类别只是一个枚举,
我尝试过使用varous嵌套的foreach和for循环,它可以工作,但它只是粗略的。我知道有一个干净的方法来做到这一点。
示例:
Categories = {PostId = 1,Category = Shopping},{PostId = 1,Category = Pizza},{PostId = 2,Category = Laundry}
序列所需输出后:
Categories = {PostId = 1,Categories = Shopping,Pizza},{PostId = 2,Categories = Laundry}
订单与类别列表无关
答案 0 :(得分:0)
如下所示
var result = yourlist.GroupBy(l=>l.PostId)
.Select(x=>new Post{ PostId =x.Key, Categories =x.SelectMany(y=>y.Categories).ToList()})
.ToList();
答案 1 :(得分: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()
};
答案 2 :(得分: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
。
答案 3 :(得分: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();
请注意,拥有一个接受PostId和Categories的Post构造函数将允许任何解决方案的更简化版本。
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();