【问题标题】:Select most repeated item by element按元素选择重复次数最多的项目
【发布时间】:2017-01-31 09:13:56
【问题描述】:

我正在尝试获取 3 篇相关文章,其中大多数标签与主文章相同。 我有这个数据库结构:

当我得到主要文章时,我得到与文章相关的标签。然后,我将文章的 IDArticle 和 TagList 传递给获取相关 3 篇文章的函数。
在文章和标签之间充当粘合剂的列表是 ArticoloTag,我认为这是要检查的列表,以获取具有最多重复标签的文章。
显然,我认为最好在服务器端使用 c# 开发此算法。如何用 linq 做到这一点?
感谢帮助

【问题讨论】:

  • 我不确定确切的代码是什么样的(我不擅长阅读 DB 结构),但它可能看起来像 var most = table.GroupBy(r => r.Tag).OrderBy(g => g.Count()).Select(g => g.Key).FirstOrDefault();

标签: c# algorithm linq logic


【解决方案1】:

为了找到标签最多的前 3 篇文章,您可以使用 ArticoloTag 并加入 IdTag

linq 可能如下所示:

ArticoloTag.Where (a=>a.IdArticolo== mainArticleId).Join(ArticoloTag, a=>a.IdTag, a=>a.IdTag, (a,b)=> b.IdArticolo).GroupBy(a=>a.IdArticolo).OrderBy(g=>g.Count()).Select(g => g.Key).Take(3)

这将取回您的 3 IdArticle。

您可以向Articolo 表添加连接以获取实际文章

【讨论】:

    【解决方案2】:

    我可能误解了您的问题,但是当您想从共享关系表的表中获取数据时,您需要从最低的表开始并在分组中备份。 您将不得不在这里执行您的数据库代码,因为我不知道您将使用什么。这不是实际的编译代码,而是指导代码:

    var list = dbConext.Tag.Where([your filter]).SelectMany( i => i.ArticoloTags).GroupBy(i => i.IDTag).OrderBy(i=>i.Count()).ToList();
    

    从此列表中你可以做你想做的事。

    【讨论】:

      【解决方案3】:

      不确定这是否效率低下,但您可以尝试这样的事情(searchTagList 是给定文章的标签列表)

      var relavantList = articleList.
                  Select(a => new {
                      artical = a,
                      relevancyCount = a.ArticoloTag.Where(tag => searchTagList.Contains(tag)).Count()
                  }).
                  ToList().
                  OrderByDescending(a => a.relevancyCount).
                  ThenBy(a => a.artical.Title). //if similar relevancy then ordered by title
                  Take(3).ToList();
      

      下面是我使用的数据结构。

      class Articolo {
      
          public int ID { get; set; }
      
          public List<Tag> ArticoloTag { get; set; }
      
          public string Title { get; set; }
      
      }
      
      class Tag {
      
          public int ID { get; set; }
      
          public string TagText { get; set; }
      }
      

      【讨论】:

        【解决方案4】:

        一种方法可以是:

        1. 从主要文章中提取标签
        2. 使用该标签查找其他文章
        3. 为找到的文章保留一个字典,并为每个匹配的标签增加一个计数器
        4. 对字典排序并取前 3 个结果

          static void Main(string[] args)
          {
              var articleTags = new List<ArticleTag>
              {
                  new ArticleTag(1, "a"),
                  new ArticleTag(1, "b"),
                  new ArticleTag(1, "c"),
                  new ArticleTag(2, "a"),
                  new ArticleTag(2, "b"),
                  new ArticleTag(3, "a"),
                  new ArticleTag(4, "b"),
                  new ArticleTag(4, "c"),
                  new ArticleTag(5, "a"),
                  new ArticleTag(5, "b"),
                  new ArticleTag(5, "c"),
              };
          
              var resultDict = new Dictionary<int, int>(); // Where we store the result
              const int mainArticleId = 1; // Your main article
              var tagsFromMainArticle = articleTags.Where(x => x.Id == mainArticleId).Select(x => x.Tag).ToList(); // All tags on the main article
          
              tagsFromMainArticle.ForEach(tag => 
                  articleTags
                      .Where(a => a.Tag == tag && a.Id != mainArticleId)
                      .ToList()
                      .ForEach(x =>
                      {
                          if (resultDict.ContainsKey(x.Id)) resultDict[x.Id]++;
                          else resultDict[x.Id] = 1;
                      }));
          
              foreach (var resultKeyValuePair in resultDict.OrderByDescending(v => v.Value).Take(3))
              {
                  Console.WriteLine($"Key = {resultKeyValuePair.Key}, Value = {resultKeyValuePair.Value}");
              }
          }
          

        这是示例的简单 ArticleTag 类

        public class ArticleTag
        {
            public ArticleTag(int id, string tag)
            {
               Id = id;
               Tag = tag;
            }
        
            public int Id { get; private set; }
            public string Tag { get; private set; }
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-18
          • 2022-01-14
          • 2020-01-03
          • 1970-01-01
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          • 2015-06-07
          • 2018-07-06
          相关资源
          最近更新 更多