我想根据他们的主题过滤我拥有的对象。
我有很多主题:艺术,经济,商业,政治。每个主题都是对象中的一个属性,我尝试从这些对象的列表中进行分类。
以下是我的对象的一部分:
public class AllQuestionsPresented
{
public string Name{ get; set; }
public string ThreadName { get; set; }
public string Topic { get; set; }
public string Subtopic { get; set; }
public int Views { get; set; }
public int Replies { get; set; }
public int PageNumber { get; set; }
public DateTime Time { get; set; }
// snip
我创建了许多这些对象,使用不同的值为其属性提供内容并将它们放入List:
List<AllQuestionsPresented> forumData;
现在我想根据他们的主题将它们全部分组到linq中。
var groupedByPages =
from n in forumData
group n by forumData
select .....
基本上我不知道如何继续因为我不习惯处理linq ..我想得到的是一些字典..
Dictionary<string,AllQuestionsPresented> dictionary..
如果我不使用linq,并将每个主题添加到字典中,它会将几个“AllQuestionsPresented”对象放在同一个主题中......这将引发异常。所以我必须使用group by ..但不知道如何实现这种操纵
答案 0 :(得分:4)
您可以使用ToLookup
,它会为您提供值集合的键/列表。您的密钥将是Topic
,您将获得每个密钥AllQuestionsPresented
的列表。
var lookup = forumData.ToLookup(f => f.Topic);
答案 1 :(得分:1)
var groupedByTopics =
from n in forumData
group n by forumData.Topic into g
select new { Topic = forumData.Topic, Questions = g }
您可能还希望将其保留以供参考: - )
答案 2 :(得分:1)
分组结果以IEnumerable<IGrouping<TKey, T>>
的形式返回,在您的情况下为IEnumerable<IGrouping<string, AllQuestionsPresented>>
。
以下代码显示了如何访问分组中的数据。
var groupedByTopic = from question in forumData
group question by question.Topic;
foreach (var group in groupedByTopic)
{
Console.WriteLine(group.Key);
foreach (var question in group)
{
Console.WriteLine("\t" + question.Name);
}
}
要从上面创建字典,您可以执行以下操作
var groupingDictionary = groupedByTopic.ToDictionary(q=>q.Key, q=>q.ToList());
这将为您提供Dictionary<string, List<AllQuestionsPresented>>
如果你去了LookUp路线,@wsanville很好地证明了这一点 ,那么你可以用同样的方式获得字典
var lookup = forumData.ToLookup(q => q.Topic);
var groupingDictionary = lookup.ToDictionary(q => q.Key, q => q.ToList());
答案 3 :(得分:0)
var groupedByPages =
from n in forumData
group n by forumData.Topic
select n;
答案 4 :(得分:0)
您只需致电ToDictionary
即可。参数是选择键的函数,另一个是选择值的函数:
var groupedByPages =
from n in forumData
group n by n.Topic;
IDictionary<string, IEnumerable<AllQuestionsPresented>> dictionary =
groupedByPages.ToDictionary(x => x.Key, x => x.AsEnumerable());
但如果IDictionary
接口所需要的只是索引操作,那么使用ILookup
就更容易了:
ILookup<string, AllQuestionsPresented> groupedByPages = forumData.ToLookup(x => x.Topic);