Написал для сайта простой и удобный, на мой взгляд :), класс наследник от WebControl'а для формирования модного на данный момент элемента любого блога - облака тэгов (tag clouds).

Исходный код контрола:

namespace ProgBlog.Controls
{
    public class TagCloudsControl : WebControl
    {
        public override void RenderBeginTag(HtmlTextWriter writer)
        {
        }

        public override void RenderEndTag(HtmlTextWriter writer)
        {
        }

        public List<TagCloudsEntry> Entrys { get; set; }

        public TagCloudsControl()
        {
            Entrys = new List<TagCloudsEntry>();
        }

        private Unit m_maxHeight = new Unit(1.5, UnitType.Em);
        private Unit m_minHeight = new Unit(0.8, UnitType.Em);
        private string m_tagDelimeter = " ";

        public string TagDelimiter { get { return m_tagDelimeter; } set { m_tagDelimeter = value; } }
        public Unit MaxHeight { get { return m_maxHeight; } set { m_maxHeight = value; } }
        public Unit MinHeight { get { return m_minHeight; } set { m_minHeight = value; } }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            if (Entrys == null || Entrys.Count() == 0)
                return;

            int maxCount = Entrys.Max(i => i.Count);
            int minCount = Entrys.Min(i => i.Count);

            for (int i = 0; i < Entrys.Count; i++)
            {
                var entry = Entrys[i];
                double percInCount = ((entry.Count - minCount) / (double)(maxCount - minCount));

                Entrys[i].Link.Font.Size = new FontUnit(
                    (m_maxHeight.Value - m_minHeight.Value) * percInCount + m_minHeight.Value, UnitType.Em);
                Entrys[i].Link.RenderControl(writer);
                writer.Write(m_tagDelimeter);
            }
        }
    }

    public class TagCloudsEntry
    {
        public HyperLink Link { get; private set; }
        public int Count { get; private set; }

        public TagCloudsEntry(HyperLink link, int count)
        {
            if ((Link = link) == null)
                throw new ArgumentNullException("link");
            if ((Count = count) < 0)
                throw new ArgumentOutOfRangeException("count");
        }
    }
}

Методы RenderBeginTag и RenderEndTag переопределены чтобы контрол не рендерил ненужный в данном случае тэг.

Использование:

1. Регистрируем контрол на странице
<%@ register namespace="ProgBlog.Controls" tagprefix="progblog" assembly="ProgBlog" %>

2.Вставляем контрол
 <progblog:TagCloudsControl ID="tagsCloud" runat="server" />
3. Заполняем тэгами
using (ProgBlogDataContext dc = new ProgBlogDataContext())
{
    Dictionary<Tag, int> postTags = new Dictionary<Tag, int>(); 
    //заполняем Dictionary и проставляем Count - количество повторений тэга
    foreach(var tag in dc.PostTags)
    {
        int count;
        if (!postTags.TryGetValue(tag.Tag, out count))
            postTags.Add(tag.Tag, 1);
        else
            postTags[tag.Tag]++; 
    }
	//заполняем тэги контрола
    foreach (var tag in postTags)
    {
        HyperLink hl = new HyperLink();
        hl.Text = tag.Key.TagName;
        hl.NavigateUrl = "~/Default.aspx?TagId="+tag.Key.TagId;
        tagsCloud.Entrys.Add(new ProgBlog.Controls.TagCloudsEntry(hl, tag.Value));
    }
}
4. Радуемся :)

Скачать контрол