在LINQ group by procedure </t>之后访问List <t>中保存的对象属性

时间:2010-01-17 17:04:15

标签: c# asp.net linq twitter

我有一个List<T>,它持有几个名为tc TwitterCollection的对象。每个tc实例包含5个属性。

TwitterCollection类看起来像这样:

public class TwitterCollection
{
    public string origURL { get; set; }
    public string txtDesc { get; set; }
    public string imgURL { get; set; }
    public string userName { get; set; }
    public string createdAt { get; set; }

}

我正在运行Linq to objects语句:

    var counts = from tc in sList
                 group tc by tc.origURL into g
                 orderby g.Count()
                 select new { myLink = g.Key, Count = g.Count() };

现在我遇到的问题是我无法访问任何tc属性。我可以访问origURL没问题,因为它已分配给g ...但txtDescimgURL和其他属性似乎无法访问。我需要上面的语句才能对数据进行适当的排序。

如何修改我的Linq语句以包含tc的所有其他属性,以及它仍然按照现在的方式按Count()排序/排序。

2 个答案:

答案 0 :(得分:3)

您已将结果分组 - 您希望获得哪个用户名?该组是一个完整的序列元素,都具有相同的URL。如果你想使用第一个,你可以这样做:

var counts = from tc in sList
             group tc by tc.origURL into g
             orderby g.Count()
             select new { myLink = g.Key, First = g.First(), Count = g.Count() };

然后你可以这样做:

foreach (var group in counts)
{
    Console.WriteLine(group.First.userName);
}

如果你想要整个小组,那就选择它:

var counts = from tc in sList
             group tc by tc.origURL into g
             orderby g.Count()
             select new { Group = g, Count = g.Count() };

不可否认,当时单独Count并没有很多点 - 您可以这样做:

var groups = sList.GroupBy(tc => tc.origURL)
                  .OrderBy(g => g.Count());

然后您可以使用:

foreach (var group in groups)
{
    int count = group.Count();
    var key = group.Key;
    foreach (var entry in group)
    {
        // Use each item in the group, etc.
    }
}

答案 1 :(得分:1)

问题是您已经有效地丢弃了组中的所有项目。你需要以某种方式维护这些信息。例如:

var groups = from tc in sList 
             group tc by tc.origURL into g 
             orderby g.Count() 
             select new { myLink = g.Key, Items = g }; 

foreach(var group in groups) {
    Console.WriteLine("Link: {0}, Count: {1}", group.myLink, group.Items.Count());
    foreach(var item in group.Items) {
        Console.WriteLine(item.txtDesc);
    }
}