-1
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();
    }
}

如何添加一个类 myReverserClass,对一组口袋妖怪进行排序,首先按名称,然后按重量?错误:至少有一个对象必须实现接口 IComparable。仅对一维数组的 Msdn 示例。而 myReverserClass 取自 msdn。

4

2 回答 2

3

CaseInsensitiveComparer.Compare文档包括:

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

在例外情况下:

ArgumentException:a 和 b 均未实现 IComparable 接口。

在这种情况下,您正在比较两个Pokemon对象,并且Pokemon没有实现IComparable- 因此是例外。

最好使用通用比较,并编写一个实现IComparer<Pokemon>. 例如:

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

请注意,在这里我实际上颠倒了参数顺序 - 而您在评论中声称这样做,但实际上仍然调用Compare(x, y). (但这并没有做重量部分 - 重要的是你一次理解一个部分......)

就我个人而言,我会以不同的方式处理事情,将反转与“按名称比较”部分分开,我也会尝试使用 LINQ,但那是另一回事。LINQ 让它变得非常简单——例如:

var ordered = pokemon.OrderByDescending(p => p.Name)
                     .ThenBy(p => p.Weight);
于 2012-06-24T18:34:59.577 回答
0

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

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;
    }
);

Array.Sort<T>(T[], Comparison<T>)这使用(而不是接受的重载)对数组进行就地排序(与 LINQ 不同IComparer)。

于 2012-06-24T18:53:43.377 回答