我需要帮助使用linq
本文关键字:linq 帮助 | 更新日期: 2023-09-27 17:59:06
我想按主题过滤我拥有的对象。
我有很多题目:艺术、经济、商业、政治。每个主题都是对象中的一个属性,我试图从这些对象的列表中对其进行分类。
以下是我的部分对象:
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<AllQuestionsPresented> forumData;
现在我想根据他们的主题把他们全部分组。。
var groupedByPages =
from n in forumData
group n by forumData
select .....
基本上我不知道如何继续,因为我不习惯与林打交道。。我想要一些字典。。
Dictionary<string,AllQuestionsPresented> dictionary..
如果我不使用linq,并将每个主题都添加到字典中,它会将几个"AllQuestionsRepresent"对象与同一主题放在一起。。这将引发异常。。所以我不得不使用groupby..,但不知道如何实现这种操作
您可以使用ToLookup
,它将为您提供一个键/值列表集合。您的密钥将是Topic
,您将获得每个密钥的AllQuestionsPresented
列表。
var lookup = forumData.ToLookup(f => f.Topic);
ToLookup 上的参考
var groupedByTopics =
from n in forumData
group n by forumData.Topic into g
select new { Topic = forumData.Topic, Questions = g }
你可能还想保留这个作为参考:-)
http://msdn.microsoft.com/en-us/vcsharp/aa336746
分组后的结果将作为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());
您可以直接调用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);
var groupedByPages =
from n in forumData
group n by forumData.Topic
select n;