我有一个基类GraphUIControl,它由4个子类继承:
BubbleGraphUIControlBatchGraphUIControlLineGraphUIControlStackedGraphUIControl有时,出于一些不明确的原因,我将所有的GraphUIControl放在同一个List<GraphUIControl>中。
我想排序我的列表(首先按图形类型,然后按名称),因此我实现了我的自定义iComparer:
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为例:
BubblueGraphUIControlBubblueGraphUIControlBubblueGraphUIControlLineGraphUIControlStackedGraphUIControl我以随机模式将其放入名为myList的列表中。当我执行myList.Sort(new GraphUIControlComparer())时,由于遵循以下规则的类型顺序,我希望myList按A, A1, A2, C, B顺序排列:
BubbleGraphUIControlBatchGraphUIControlLineGraphUIControlStackedGraphUIControl然后A, A1, A2按字母顺序排列。
发布于 2015-04-03 14:44:07
在大多数情况下,避免使用GetType()是个好主意。使用它表明你的设计有问题。但是,如果你愿意使用它,有一个非常有趣的方式来写这个(我不会说它很好,它只是有趣和简短):
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
https://codereview.stackexchange.com/questions/85780
复制相似问题