我需要帮助使用linq

时间:2011-06-13 15:29:21

标签: c# linq

我想根据他们的主题过滤我拥有的对象。

我有很多主题:艺术,经济,商业,政治。每个主题都是对象中的一个属性,我尝试从这些对象的列表中进行分类。

以下是我的对象的一部分:

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 ..但不知道如何实现这种操纵

5 个答案:

答案 0 :(得分:4)

您可以使用ToLookup,它会为您提供值集合的键/列表。您的密钥将是Topic,您将获得每个密钥AllQuestionsPresented的列表。

var lookup = forumData.ToLookup(f => f.Topic);

Reference on ToLookup

答案 1 :(得分:1)

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

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