Алгоритм в облаках тегов (Расчет) - PullRequest
0 голосов
/ 09 января 2010

У меня есть список тегов, который содержит список дублированных тегов, таких как «tag1», «tag1», «tag2», «tag3», «tag3» и «tag2».

Я хочу вычислить, сколько тегов tag1, tag2 и tag3 находятся в списке, а затем добавить их в новый список тегов, например var tagList = new List<Tag>(), в нем будут тысячи тегов. Может ли кто-нибудь помочь мне добиться этого эффективным способом? В списке должны быть имя тега и количество тегов (количество).

Вот мои Tag свойства класса:

    public int TagID { get; set; }
    public string TagName { get; set; }
    public int TagCount { get; set; }

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 09 января 2010

Я не могу сказать из вашего описания, есть ли у вас IEnumerable<string>, представляющий теги, или IEnumerable<Tag>, представляющий теги, поэтому вот подход для обоих:

Для случая Tag:

List<Tag> tags = new List<Tag>() {
    new Tag() { TagName = "tag1" },
    new Tag() { TagName = "tag1" },
    new Tag() { TagName = "tag2" },
    new Tag() { TagName = "tag3" },
    new Tag() { TagName = "tag3" },
    new Tag() { TagName = "tag2" }
};
var tagList = tags.GroupBy(t => t.TagName)
                  .Select(g => new Tag() {
                      TagName = g.Key,
                      TagCount = g.Count()
                  })
                  .ToList();

Для случая string:

List<string> list = new List<string>() {
    "tag1",
    "tag1",
    "tag2",
    "tag3",
    "tag3",
    "tag2"
};
var tagList = list.GroupBy(s => s)
                  .Select(g => new Tag() {
                      TagName = g.Key,
                      TagCount = g.Count() 
                  })
                  .ToList(); 

В обоих случаях я использовал определение

class Tag {
    public int TagID { get; set; }
    public string TagName { get; set; }
    public int TagCount { get; set; }
}
0 голосов
/ 09 января 2010

Если я правильно понимаю ваш вопрос, думаю, это сработает. Вы хотите сгруппировать по идентификатору и имени тега, а затем суммировать количество для каждого из тегов в существующем списке.

var tagList = existingList.GroupBy( t => new { t.TagID, t.TagName } )
                          .Select( g => new Tag {
                                         TagID = g.Key.TagID,
                                         TagName = g.Key.TagName,
                                         TagCount = g.Sum( t => t.TagCount )
                          })
                          .ToList();
...