寻求优雅的linq解决方案

时间:2015-03-31 05:38:41

标签: c# asp.net linq

我有一个这样的模型:

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}

订单与类别列表无关

4 个答案:

答案 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();