Доступ к свойствам объекта в Списке <T>после группировки LINQ по процедуре - PullRequest
1 голос
/ 17 января 2010

У меня есть 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 ... но txtDesc, imgURL и другие свойства кажутся недоступными.Мне нужен вышеуказанный оператор для правильной сортировки моих данных.

Как я могу изменить свой оператор Linq, включив в него все другие свойства tc, плюс для того, чтобы он все еще был отсортирован / упорядочен по Count()так, как сейчас.

Ответы [ 2 ]

3 голосов
/ 17 января 2010

Вы сгруппировали результаты - так какое имя пользователя вы ожидаете получить? Группа представляет собой целую последовательность элементов с одинаковым 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 голос
/ 17 января 2010

Проблема в том, что вы фактически отбросили все предметы в группе. Вам нужно как-то поддерживать эту информацию. Например:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...