1. ホーム
  2. c#

[解決済み] 少なくとも1つのオブジェクトはIComparableを実装していなければならない

2022-01-31 07:50:14

質問

using System;
using System.Xml;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SortedSet<Player> PlayerList = new SortedSet<Player>();

            while (true)
            {
                string Input;
                Console.WriteLine("What would you like to do?");
                Console.WriteLine("1. Create new player and score.");
                Console.WriteLine("2. Display Highscores.");
                Console.WriteLine("3. Write out to XML file.");
                Console.Write("Input Number: ");
                Input = Console.ReadLine();
                if (Input == "1")
                {
                    Player player = new Player();
                    string PlayerName;
                    string Score;

                    Console.WriteLine();
                    Console.WriteLine("-=CREATE NEW PLAYER=-");
                    Console.Write("Player name: ");
                    PlayerName = Console.ReadLine();
                    Console.Write("Player score: ");
                    Score = Console.ReadLine();

                    player.Name = PlayerName;
                    player.Score = Convert.ToInt32(Score);

                    //====================================
                    //ERROR OCCURS HERE
                    //====================================
                    PlayerList.Add(player);


                    Console.WriteLine("Player \"" + player.Name + "\" with the score of \"" + player.Score + "\" has been created successfully!" );
                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine("INVALID INPUT");
                }
            }
        }
    }
}

だから、私は " を取得し続けます。

少なくとも1つのオブジェクトがIComparableを実装している必要があります。

"2人目の選手を追加しようとすると、1人目はうまくいきますが、2人目はうまくいきません。 また、私はMUSTで SortedSet というのも、それが作品の条件になっているからです、学校の授業です。

どのように解決するのですか?

さて、あなたが使おうとしているのは SortedSet<> ...つまり、順序を気にするということですね。しかし、その音からすると、あなたの Player 型は IComparable<Player> . では、どのようなソート順で表示されるのでしょうか?

基本的には Player のコードは、あるプレーヤーと別のプレーヤーを比較する方法を示しています。別の方法として IComparer<Player> のコンストラクタにその比較を渡します。 SortedSet<> を使用して、プレーヤーをどのような順序で配置するかを示します。例えば、次のようになります。

public class PlayerNameComparer : IComparer<Player>
{
    public int Compare(Player x, Player y)
    {
        // TODO: Handle x or y being null, or them not having names
        return x.Name.CompareTo(y.Name);
    }
}

次に

// Note name change to follow conventions, and also to remove the
// implication that it's a list when it's actually a set...
SortedSet<Player> players = new SortedSet<Player>(new PlayerNameComparer());