首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义iComparer

自定义iComparer
EN

Code Review用户
提问于 2015-04-03 12:40:12
回答 1查看 129关注 0票数 3

我有一个基类GraphUIControl,它由4个子类继承:

  • BubbleGraphUIControl
  • BatchGraphUIControl
  • LineGraphUIControl
  • StackedGraphUIControl

有时,出于一些不明确的原因,我将所有的GraphUIControl放在同一个List<GraphUIControl>中。

我想排序我的列表(首先按图形类型,然后按名称),因此我实现了我的自定义iComparer

代码语言:javascript
复制
public class GraphUIControlComparer : IComparer<GraphUIControl>
{
    public int Compare(GraphUIControl x, GraphUIControl y)
    {
        if (x.GetType() == y.GetType())
        {
            return String.Compare(x.Parent.Name, y.Parent.Name, StringComparison.Ordinal);
        }
        if (x is BubbleGraphUIControl)
        {
            return -1;
        }
        if (y is BubbleGraphUIControl)
        {
            return 1;
        }
        if (x is BatchGraphUIControl)
        {
            return -1;
        }
        if (y is BatchGraphUIControl)
        {
            return 1;
        }
        if (x is LineGraphUIControl)
        {
            return -1;
        }
        if (y is LineGraphUIControl)
        {
            return 1;
        }
        if (x is StackedGraphUIControl)
        {
            return -1;
        }
        if (y is StackedGraphUIControl)
        {
            return 1;
        }       
        return 0;
    }
}

但它似乎非常冗长,我很想把它缩短(而且,这也是我的第一次iComparer,如果我犯了一个错误/胡说八道/无论如何,不要犹豫地告诉我!)

示例:

让我们以A, A1, A2, B & C为例:

  • A是BubblueGraphUIControl
  • A1是BubblueGraphUIControl
  • A2是BubblueGraphUIControl
  • C是LineGraphUIControl
  • B是StackedGraphUIControl

我以随机模式将其放入名为myList的列表中。当我执行myList.Sort(new GraphUIControlComparer())时,由于遵循以下规则的类型顺序,我希望myListA, A1, A2, C, B顺序排列:

  1. BubbleGraphUIControl
  2. BatchGraphUIControl
  3. LineGraphUIControl
  4. StackedGraphUIControl

然后A, A1, A2按字母顺序排列。

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-04-03 14:44:07

在大多数情况下,避免使用GetType()是个好主意。使用它表明你的设计有问题。但是,如果你愿意使用它,有一个非常有趣的方式来写这个(我不会说它很好,它只是有趣和简短):

代码语言:javascript
复制
public class GraphUIControlComparer : IComparer<GraphUIControl>
{
    private int NameCompare(GraphUIControl x, GraphUIControl y)
    {
        return String.Compare(x.Parent.Name, y.Parent.Name, StringComparison.Ordinal);
    }

    private static readonly Dictionary<Type, int> typeLookupDict
      = new Dictionary<Type,int>
      {
         {typeof(BubbleGraphUIControl), 0},
         {typeof(BatchGraphUIControl), 1},
         {typeof(LineGraphUIControl), 2},
         {typeof(StackedGraphUIControl), 3}
      };

    private int TypeLookup(GraphUIControl x)
    {
       return typeLookupDict[x.GetType()];
    }

    public int Compare(GraphUIControl x, GraphUIControl y)
    {
        int tx = TypeLookup(x);
        int ty = TypeLookup(y);
        if (tx == ty)
        {
            return NameCompare(x,y);
        }
        return (tx < ty ? -1 : 1);
    }
}

还请参见https://stackoverflow.com/questions/4287537/checking-if-the-object-is-of-same-type

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/85780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档