2011-02-25 78 views
6

这让我疯狂。我正在基于%值基于数据库中标记的计数显示标记云。我注意到,当一个标签被retrived,相关的字体大小是巨大的(因为100%的检索),所以有些人建议我这样做:标签云字体大小计算逻辑

var tagSummaryNegative = from af in db.AgileFactors 
        join psf in db.ProjectStoryFactors on af.AgileFactorID equals psf.AgileFactorID 
        join s in db.Stories on psf.StoryID equals s.StoryID 
        join pim in db.ProjectIterationMembers on s.ProjectIterationMemberID equals pim.ProjectIterationMemberID 
        join it in db.Iterations on pim.ProjectIterationID equals it.ProjectIterationID 
        join pro in db.Projects on it.ProjectID equals pro.ProjectID 
        where pro.ProjectID == pro_id && 
          pro.ProjectID == it.ProjectID && 
          it.ProjectIterationID == pim.ProjectIterationID && 
          pim.ProjectIterationMemberID == s.ProjectIterationMemberID && s.StoryCategoryID == 1 && 
          s.StoryID == psf.StoryID && 
          psf.AgileFactorID == af.AgileFactorID 
        group af by af.Name into tagGroup 

        select new 
        { 

         Tag = tagGroup.Key, 
         tagCount = tagGroup.Count() 

        }; 

int maxTagFrequencyNegative = (from t in tagSummaryNegative select (int?)t.tagCount).Max() ?? 0; 

var tagCloudNegative = from af in db.AgileFactors 
        join psf in db.ProjectStoryFactors on af.AgileFactorID equals psf.AgileFactorID 
        join s in db.Stories on psf.StoryID equals s.StoryID 
        join pim in db.ProjectIterationMembers on s.ProjectIterationMemberID equals pim.ProjectIterationMemberID 
        join it in db.Iterations on pim.ProjectIterationID equals it.ProjectIterationID 
        join pro in db.Projects on it.ProjectID equals pro.ProjectID 
        where pro.ProjectID == pro_id && 
         pro.ProjectID == it.ProjectID && 
         it.ProjectIterationID == pim.ProjectIterationID && 
         pim.ProjectIterationMemberID == s.ProjectIterationMemberID && s.StoryCategoryID == 1 && 
         s.StoryID == psf.StoryID && 
         psf.AgileFactorID == af.AgileFactorID 
        group af by af.Name into tagGroup 
        select new 
        { 

         Tag = tagGroup.Key, 
         **weight = (tagGroup.Count() == 1) ? (double)1 : ((double)tagGroup.Count()/maxTagFrequencyNegative * 100)** 
        }; 

现在,当计数为1,字体很小,但是当2,它又回到了巨大的水平。计数较小的标签相对于具有最大计数的标签变小 - 但我需要它从小尺寸开始并保持增长。请帮忙!

public string GetTagSize(double weight) 
{ 

    if (weight >= 99) 
     return "36pt"; 
    else if (weight >= 80) 
     return "29pt"; 
    else if (weight >= 64) 
     return "23pt"; 
    else if (weight >= 48) 
     return "18pt"; 
    else if (weight >= 32) 
     return "14pt"; 
    else if (weight >= 10) 
     return "11pt"; 
    else 
     return "8pt"; 
} 
+0

'maxTagFrequencyNegative'的值是什么?为什么你会用一个负值来分割? – Justin 2011-02-25 18:16:11

+0

这不是一个负值 - 我使用的是LINQ ... maxTagFrequencyNegative只是带有相关负面故事的标签的别名... – user618616 2011-02-25 18:18:12

+0

+1对于推荐对人们很好,它只会鼓励一个良好的社区,如果您奖励回答你喜欢/用过 – 2011-02-25 18:23:34

回答

0

尝试使用

int expectedSize = 36; //Or whatever the max size should be 
double size = weight/tagGroup.count(); 
size = max(0, min(size, 1); //bounds size to between 1 and 0 just incase 
//I'm assuming tagGroup.count() returns the number of tags. replace this as need 

size = size * expectedSize; 

return (int)size + "pt"; 

的想法是,你得到1和0之间的标签的相对大小然后通过预期的大小相乘这一点。

希望帮助

0

您的问题似乎是maxTagFrequencyNegative值。

根据您的代码: 当体重> 98时,字体大小应该是最大的。 当重量为< 10时,字体大小最小。

尝试以下操作:

weight = (tagGroup.Count() == 1) ? 
    (double)1 : ((double)tagGroup.Count()/maxTagCount * 100) 

哪里maxTagCount是最大数量的标签,对于任何给定的标签。

要测试此操作,请尝试手动将自己设置为maxTagCount以接近最大标记计数,并查看您的结果是否合理。

1

您可以使用Rad Tag Cloud Control,您的工作会更轻松。 试试这个。