我需要帮助使用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..,但不知道如何实现这种操作

我需要帮助使用linq

您可以使用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;