C# 至少有一个对象必须实现接口IComparable 类程序 { 公共类口袋妖怪 { 公共字符串名称; 公共权重; } 公共类myReverserClass:IComparer { //调用CaseInsensitiveComparer。与反转的参数进行比较。 int IComparer.Compare(对象x、对象y) { 返回((new CaseInsensitiveComparer()).Compare(x,y)); } } 静态void Main(字符串[]参数) { IComparer myComparer=新的myReverserClass(); 随机r=新随机(); 字符串[]口袋妖怪=新字符串[10]; 口袋妖怪[0]=“Bulbasaur”; 口袋妖怪[1]=“魔法师”; 口袋妖怪[2]=“水仙花”; 口袋妖怪[3]=“格劳利特”; 口袋妖怪[4]=“猫猫”; 口袋妖怪[5]=“Weedle”; 口袋妖怪[6]=“卡库纳”; 口袋妖怪[7]=“Beedrill”; 口袋妖怪[8]=“皮吉”; 口袋妖怪[9]=“Ratta”; 字符串[]sovpad=新字符串[10]; 口袋妖怪[]口袋妖怪=新的口袋妖怪[10]; for(int i=0;i{ //注意:如果您想要颠倒顺序,请反转参数。 int result=string.Compare(pokemon1.Name,pokemon2.Name,true); 如果(结果!=0) 返回结果; 如果(口袋妖怪1.重量口袋妖怪2.Weight) 返回1; 返回0; } );

C# 至少有一个对象必须实现接口IComparable 类程序 { 公共类口袋妖怪 { 公共字符串名称; 公共权重; } 公共类myReverserClass:IComparer { //调用CaseInsensitiveComparer。与反转的参数进行比较。 int IComparer.Compare(对象x、对象y) { 返回((new CaseInsensitiveComparer()).Compare(x,y)); } } 静态void Main(字符串[]参数) { IComparer myComparer=新的myReverserClass(); 随机r=新随机(); 字符串[]口袋妖怪=新字符串[10]; 口袋妖怪[0]=“Bulbasaur”; 口袋妖怪[1]=“魔法师”; 口袋妖怪[2]=“水仙花”; 口袋妖怪[3]=“格劳利特”; 口袋妖怪[4]=“猫猫”; 口袋妖怪[5]=“Weedle”; 口袋妖怪[6]=“卡库纳”; 口袋妖怪[7]=“Beedrill”; 口袋妖怪[8]=“皮吉”; 口袋妖怪[9]=“Ratta”; 字符串[]sovpad=新字符串[10]; 口袋妖怪[]口袋妖怪=新的口袋妖怪[10]; for(int i=0;i{ //注意:如果您想要颠倒顺序,请反转参数。 int result=string.Compare(pokemon1.Name,pokemon2.Name,true); 如果(结果!=0) 返回结果; 如果(口袋妖怪1.重量口袋妖怪2.Weight) 返回1; 返回0; } );,c#,C#,文件包括: 如果a和b都是字符串,则此方法使用CompareInfo.Compare比较忽略大小写的字符串;否则,它使用任一对象的IComparable实现。也就是说,如果a实现IComparable,则此方法返回a.CompareTo(b)的结果;否则,如果b实现了IComparable,则它将b.CompareTo的求反结果返回(a) 在例外情况下: ArgumentException:a和b都没有实现IComparable接口 在本例中,您正在比较两个Pokemon对象,而Pokemon没

文件包括:

如果a和b都是字符串,则此方法使用CompareInfo.Compare比较忽略大小写的字符串;否则,它使用任一对象的IComparable实现。也就是说,如果a实现IComparable,则此方法返回a.CompareTo(b)的结果;否则,如果b实现了IComparable,则它将b.CompareTo的求反结果返回(a)

在例外情况下:

ArgumentException:a和b都没有实现IComparable接口

在本例中,您正在比较两个
Pokemon
对象,而
Pokemon
没有实现
IComparable
——因此出现了异常

您最好使用泛型比较,编写一个实现
IComparer
的类。例如:

class Program
{
    public class Pokemon
    {
        public string Name;
        public int Weight;
    }


    public class myReverserClass : IComparer
    {

        // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
        int IComparer.Compare(Object x, Object y)
        {
            return ((new CaseInsensitiveComparer()).Compare(x, y));
        }
    }


    static void Main(string[] args)
    {
        IComparer myComparer = new myReverserClass();

        Random r = new Random();

        string[] pokemons = new string[10];
        pokemons[0] = "Bulbasaur";
        pokemons[1] = "Charmander";
        pokemons[2] = "Squirtle";
        pokemons[3] = "Groulit";
        pokemons[4] = "Caterpie";
        pokemons[5] = "Weedle";
        pokemons[6] = "Kakuna";
        pokemons[7] = "Beedrill";
        pokemons[8] = "Pidgey";
        pokemons[9] = "Rattata";

        string[] sovpad = new string[10];
        Pokemon[] pokemon = new Pokemon[10];

        for (int i = 0; i < pokemons.Length; i++)
        {
            string sovpadtrue;
            sovpadtrue = pokemons[r.Next(0, pokemons.Length)];
            for(int p = 0; p<sovpad.Length;p++)
            {
                if(sovpadtrue == sovpad[p])
                {
                    sovpadtrue = pokemons[r.Next(0, pokemons.Length)];
                    p = -1;
                }
            }
            sovpad[i] = sovpadtrue;
            pokemon[i] = new Pokemon();
            pokemon[i].Name = sovpadtrue;
            pokemon[i].Weight = r.Next(10, 1000);
        }
        Array.Sort(pokemon,myComparer);

        Console.ReadLine();
    }
}
public class PokemonReverseNameComparer : IComparer<Pokemon>
{
    public int Compare(Pokemon x, Pokemon y)
    {
        return StringComparer.OrdinalIgnoreCase.Compare(y.Name, x.Name);
    }
}

除了Jon Skeet的建议外,您还可以这样做:

var ordered = pokemon.OrderByDescending(p => p.Name)
                     .ThenBy(p => p.Weight);
Array.Sort(
精灵宝可梦
(口袋妖怪1,口袋妖怪2)=>{
//注意:如果您想要颠倒顺序,请反转参数。
int result=string.Compare(pokemon1.Name,pokemon2.Name,true);
如果(结果!=0)
返回结果;
如果(口袋妖怪1.重量<口袋妖怪2.重量)
返回-1;
如果(口袋妖怪1.Weight>口袋妖怪2.Weight)
返回1;
返回0;
}
);
这将使用
array.Sort(T[],Comparison)
(而不是接受
IComparer
的重载)对数组进行就地排序(与LINQ不同)

Array.Sort(
    pokemon,
    (pokemon1, pokemon2) => {
        // NOTE: Reverse arguments if you want reverse order.
        int result = string.Compare(pokemon1.Name, pokemon2.Name, true);
        if (result != 0)
            return result;
        if (pokemon1.Weight < pokemon2.Weight)
            return -1;
        if (pokemon1.Weight > pokemon2.Weight)
            return 1;
        return 0;
    }
);