LinQ C#-根据对象列表中包含的字符串对对象列表进行分组<;字符串>;财产

LinQ C#-根据对象列表中包含的字符串对对象列表进行分组<;字符串>;财产,c#,linq,list,collections,group-by,C#,Linq,List,Collections,Group By,我对字符串列表的分组有问题 我的类“Post”包含一个名为Tags的列表属性: public class Post { public string Title { get; set; } public int Position { get; set; } public List<string> Tags { get; set; } } 我想我需要使用GroupBy(),但我仍然坚持使用语法,因为: List<Post> Posts = // al

我对字符串列表的分组有问题

我的类“Post”包含一个名为Tags的列表属性:

public class Post
{
    public string Title { get; set; }
    public int Position { get; set; }
    public List<string> Tags { get; set; }
}
我想我需要使用GroupBy(),但我仍然坚持使用语法,因为:

List<Post> Posts = // all my posts
ILookup<string, Post> ByTag = Posts.GroupBy(p => p.Tags) ...
List Posts=//所有我的帖子
ILookup ByTag=Posts.GroupBy(p=>p.Tags)。。。
显然是针对标签列表,而不是单个标签

有什么建议吗

var tags = Posts.SelectMany(p => p.Tags).Distinct();
var groups = from p in Posts
    from t in tags.Where(tag => p.Tags.Contains(tag))
    group p by t
    into gr
    select gr;
解释 SelectMany.Distinct-使IEnumerable,其中包含所有帖子中的所有标记,没有重复项。 前2个from-连接标记和帖子。连接条件-立柱应包含标签。最终的收集将包含每一对帖子及其标签。 Group将以某种方式对这些对进行分组,gr的键将是一个标记,gr将是带有该标记的所有帖子的集合。我习惯了字典,编写了一段代码,以后可以通过调用
ToDictionary(g=>g.Key,g=>g.ToList())
将其转换为
Dictionary
。如果要查找,则不需要组部件:

var tags = Posts.SelectMany(p => p.Tags).Distinct();
var postAndTagPairs = from p in Posts
    from t in tags.Where(tag => p.Tags.Contains(tag))
    select new {t, p};
var lookup = postAndTagPairs.ToLookup(pat => pat.t, pat => pat.p);

您首先需要获得一个不同的标记列表。假设职位在如下列表中:

var posts = new List<Post>
{
    new Post { Tags = new List<string>(){"a", "b", "c"} },
    new Post { Tags = new List<string>(){"a", "d", "e"} },
    new Post { Tags = new List<string>(){"b", "c", "d"} },
    new Post { Tags = new List<string>(){"c", "d", "f"} }
};
var allTags = posts.SelectMany(p => p.Tags).Distinct();
然后您可以进行分组:

var result = from p in posts
             from t in allTags.Where(t => p.Tags.Contains(t))
             group p by t into grp
             select grp;

我试试这个,谢谢。出于知识的考虑,您将如何使用LinQ方法编写它?它正在工作,但并不完全符合我的预期。你的代码返回一个IEnumerableI我很困惑,IEnumerable没有两个类型参数?嗯…没有!IEnumerable是非泛型集合的接口,该集合可以在键上编制索引,也可以不编制索引。列表和数组都是IEnumerables:非常有用,谢谢!还可以在Where子句中指定一个函数,使标记后关系更加灵活和高级。
var allTags = posts.SelectMany(p => p.Tags).Distinct();
var result = from p in posts
             from t in allTags.Where(t => p.Tags.Contains(t))
             group p by t into grp
             select grp;