Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较SortedDictionary的键类型_C#_Types_Dictionary_Comparator - Fatal编程技术网

C# 比较SortedDictionary的键类型

C# 比较SortedDictionary的键类型,c#,types,dictionary,comparator,C#,Types,Dictionary,Comparator,我想为SortedDictionary编写一个自定义比较器,其中键根据其类型进行排序。这可能吗 public class StateBase { // This is a base class I have to inherit from } SortedDictionary<StateBase, int> _stateDictionary = new SortedDictionary<StateBase, int>(new StateComparer(

我想为
SortedDictionary
编写一个自定义比较器,其中键根据其类型进行排序。这可能吗

public class StateBase
{
    // This is a base class I have to inherit from
}

SortedDictionary<StateBase, int> _stateDictionary =
    new SortedDictionary<StateBase, int>(new StateComparer());

class StateComparer : IComparer<StateBase>
{
    public int Compare(StateBase a, StateBase b)
    {
        // I'd like to sort these based on their type
        // I don't particularly care what order they are in, I just want them
        // to be sorted.
    }
}
公共类StateBase
{
//这是我必须继承的基类
}
分类词典=
新的SortedDictionary(新的StateComarer());
类状态比较器:IComparer
{
公共整数比较(StateBase a、StateBase b)
{
//我想根据它们的类型来分类
//我并不特别在意它们的顺序,我只是想要它们
//待分类。
}
}

您可以。如果比较器实现,则可以通过相应的

然后,
Compare
方法以某种方式决定哪个项目更大或更低。它是您可以实现按类型比较逻辑的地方

下面是一个基于实例名称比较
类型
实例的示例:

public class TypeComparer : IComparer<Type>
{
    public int Compare(Type x, Type y)
    {
        if(x != null && y != null)
            return x.FullName.CompareTo(y.FullName);
        else if(x != null)
            return x.FullName.CompareTo(null);
        else if(y != null)
            return y.FullName.CompareTo(null);
        else
            return 0;
    }
}
公共类类型比较器:IComparer
{
公共整数比较(类型x、类型y)
{
如果(x!=null&&y!=null)
返回x.FullName.CompareTo(y.FullName);
如果(x!=null),则为else
返回x.FullName.CompareTo(null);
如果(y!=null),则为else
返回y.FullName.CompareTo(null);
其他的
返回0;
}
}

您可以。如果比较器实现,则可以通过相应的

然后,
Compare
方法以某种方式决定哪个项目更大或更低。它是您可以实现按类型比较逻辑的地方

下面是一个基于实例名称比较
类型
实例的示例:

public class TypeComparer : IComparer<Type>
{
    public int Compare(Type x, Type y)
    {
        if(x != null && y != null)
            return x.FullName.CompareTo(y.FullName);
        else if(x != null)
            return x.FullName.CompareTo(null);
        else if(y != null)
            return y.FullName.CompareTo(null);
        else
            return 0;
    }
}
公共类类型比较器:IComparer
{
公共整数比较(类型x、类型y)
{
如果(x!=null&&y!=null)
返回x.FullName.CompareTo(y.FullName);
如果(x!=null),则为else
返回x.FullName.CompareTo(null);
如果(y!=null),则为else
返回y.FullName.CompareTo(null);
其他的
返回0;
}
}

当然可以,为什么不呢?请注意,我们必须讨论引用类型才能应用此功能,因此类似于:

public class TypeComparer<T> : IComparer<T>, IEqualityComparer<T> where T : class
{
    public static readonly TypeComparer<T> Singleton= new TypeComparer<T>();
    private TypeComparer(){}
    bool IEqualityComparer<T>.Equals(T x, T y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (x == null || y == null) return false;
        Type xType = x.GetType(), yType = y.GetType();
        return xType == yType && EqualityComparer<T>.Default.Equals(x, y);
    }
    int IEqualityComparer<T>.GetHashCode(T x)
    {
        if (x == null) return 0;
        return -17*x.GetType().GetHashCode() + x.GetHashCode();
    }
    int IComparer<T>.Compare(T x, T y)
    {
        if(x==null) return y == null ? 0 : -1;
        if (y == null) return 1;

        Type xType = x.GetType(), yType = y.GetType();
        int delta = xType == yType ? 0 : string.Compare(
               xType.FullName, yType.FullName);
        if (delta == 0) delta = Comparer<T>.Default.Compare(x, y);
        return delta;
    }
}
公共类类型比较器:IComparer,iQualityComparer,其中T:class
{
public static readonly TypeComparer Singleton=new TypeComparer();
专用类型比较器(){}
布尔IEqualityComparer.Equals(Tx,Ty)
{
if(ReferenceEquals(x,y))返回true;
如果(x==null | | y==null)返回false;
类型xType=x.GetType(),yType=y.GetType();
返回xType==yType&&EqualityComparer.Default.Equals(x,y);
}
int IEqualityComparer.GetHashCode(TX)
{
如果(x==null)返回0;
return-17*x.GetType().GetHashCode()+x.GetHashCode();
}
int IComparer.Compare(T x,T y)
{
如果(x==null)返回y==null?0:-1;
如果(y==null)返回1;
类型xType=x.GetType(),yType=y.GetType();
int delta=xType==yType?0:字符串。比较(
xType.FullName,yType.FullName);
如果(delta==0)delta=Comparer.Default.Compare(x,y);
返回三角洲;
}
}

当然可以,为什么不呢?请注意,我们必须讨论引用类型才能应用此功能,因此类似于:

public class TypeComparer<T> : IComparer<T>, IEqualityComparer<T> where T : class
{
    public static readonly TypeComparer<T> Singleton= new TypeComparer<T>();
    private TypeComparer(){}
    bool IEqualityComparer<T>.Equals(T x, T y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (x == null || y == null) return false;
        Type xType = x.GetType(), yType = y.GetType();
        return xType == yType && EqualityComparer<T>.Default.Equals(x, y);
    }
    int IEqualityComparer<T>.GetHashCode(T x)
    {
        if (x == null) return 0;
        return -17*x.GetType().GetHashCode() + x.GetHashCode();
    }
    int IComparer<T>.Compare(T x, T y)
    {
        if(x==null) return y == null ? 0 : -1;
        if (y == null) return 1;

        Type xType = x.GetType(), yType = y.GetType();
        int delta = xType == yType ? 0 : string.Compare(
               xType.FullName, yType.FullName);
        if (delta == 0) delta = Comparer<T>.Default.Compare(x, y);
        return delta;
    }
}
公共类类型比较器:IComparer,iQualityComparer,其中T:class
{
public static readonly TypeComparer Singleton=new TypeComparer();
专用类型比较器(){}
布尔IEqualityComparer.Equals(Tx,Ty)
{
if(ReferenceEquals(x,y))返回true;
如果(x==null | | y==null)返回false;
类型xType=x.GetType(),yType=y.GetType();
返回xType==yType&&EqualityComparer.Default.Equals(x,y);
}
int IEqualityComparer.GetHashCode(TX)
{
如果(x==null)返回0;
return-17*x.GetType().GetHashCode()+x.GetHashCode();
}
int IComparer.Compare(T x,T y)
{
如果(x==null)返回y==null?0:-1;
如果(y==null)返回1;
类型xType=x.GetType(),yType=y.GetType();
int delta=xType==yType?0:字符串。比较(
xType.FullName,yType.FullName);
如果(delta==0)delta=Comparer.Default.Compare(x,y);
返回三角洲;
}
}

所有钥匙的类型都相同。你能澄清一下吗?钥匙都是同一类型的。你能澄清一下吗?我想知道是否有一种语言定义的方式来排序
类型
对象。排序可能是完全任意的。老实说,我不知道。但是,它不实现
i可比较
。例如,你可以使用他们的名字。我会在帖子中添加一个例子。啊,对。这个名字是一个完美的解决方案!请将其作为编辑添加到您的答案中,以便我可以接受它。:)我想知道是否有一种语言定义的方式来排序
Type
对象。排序可能是完全任意的。老实说,我不知道。但是,它不实现
i可比较
。例如,你可以使用他们的名字。我会在帖子中添加一个例子。啊,对。这个名字是一个完美的解决方案!请将其作为编辑添加到您的答案中,以便我可以接受它。:)