【问题标题】:How do I sort these arrays of objects in ascending order in C#?如何在 C# 中按升序对这些对象数组进行排序?
【发布时间】:2013-11-21 16:15:23
【问题描述】:

这是我的对象数组

Game[] gameConsoles = new Games[5];
// paramaters are name of the console and game ID
gameConsoles[0] = new Games("Playstation 4", 101);
gameConsoles[1] = new Games("Xbox 1", 108);
gameConsoles[2] = new Games("PS Vita", 110);
gameConsoles[3] = new Games("Wii U", 104);
gameConsoles[4] = new Games("3DS", 102);

for (int i = 0; i < gameConsoles.Length; i++)
{
    gameConsoles[i].display();
}

它基本上会在每个消息框中显示所有 5 个对象,但我如何制作它才能根据游戏 ID 升序显示它们?

我在对常规数字数组进行排序时使用的排序算法。

public void ascendingOrder()
{
    // helper class
    double temp = 0;

    for (int j = 0; j < numbers.Length; j++)
    {
        for (int i = 0; i < numbers.Length - 1; i++)
        {
            if (numbers[i] > numbers[i + 1])
            {
                temp = numbers[i];
                numbers[i] = numbers[i + 1];
                numbers[i + 1] = temp;
            }
        }
    }
}

【问题讨论】:

  • 呃,如果这涉及到使用“=>”符号,那我不会使用它。
  • 为什么不呢?学习一点 lambda 语法(即 =&gt;)和 LINQ(这是一个方法库,如 OrderBy)非常值得。或者,您是否需要在家庭作业中实现排序算法?
  • @TimS。我以为我的教授不让我,但他实际上接受了,所以没关系。

标签: c# arrays sorting


【解决方案1】:

您可以使用 LINQ OrderBy

foreach(var item in gameConsole.OrderBy(r=> r.GameID))
{
   item.display();
}

【讨论】:

  • 是否可以避免使用 => 符号?我认为我的老师不允许我这样做。
  • @puretppc,它的 lambda 表达式,是否需要实现自己的自定义排序逻辑?
  • 我曾经使用嵌套循环做了一种排序算法。这就是为什么我更喜欢使用我可以理解的代码。我只是不知道如何将一个用于对象数组中的特定属性。
  • @puretppc,用你已经尝试过的排序更新你的问题,并询问你卡在哪里。在您当前的问题中,不清楚并且没有提到您不想使用 LINQ
  • 我从其他程序中复制并粘贴了代码,并从嵌套循环中获取了升序代码。
【解决方案2】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            SortedDictionary<int, Game> gameConsoles = new SortedDictionary<int, Game>();

            gameConsoles.Add(101, new Game("Playstation 4", 101));
            gameConsoles.Add(108, new Game("Xbox 1", 108));
            gameConsoles.Add(110, new Game("PS Vita", 110));
            gameConsoles.Add(104, new Game("Wii U", 104));
            gameConsoles.Add(102, new Game("3DS", 102));

            foreach (KeyValuePair<int, Game> item in gameConsoles)
            {
                Console.WriteLine(item.Value.ToString());
            }

            Console.ReadKey();
        }
    }

    public class Game
    {
        public Game(string name, int id)
        {
            Id = id;
            Name = name;
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public override string ToString()
        {
            return string.Format("Id: {0} Name: {1}", Id, Name);
        }
    }
}

【讨论】:

    【解决方案3】:

    在 .NET 中有三种常用的排序方式:

    这里是你如何实现IComparable&lt;Games&gt;

    class Games : IComparable<Games> {
        public int CompareTo(Games other) {
            return GameId.CompareTo(other.GameId);
        }
    }
    

    现在您的Games 将根据GameId 进行排序。

    这是您如何使用外部IComparer&lt;Games&gt;

    class CompareGamesOnId : IComparer<Games> {
        int Compare(Games a, Games b) {
            return a.GameId.CompareTo(b.GameId);
        }
    }
    

    你像这样打电话给Sort

    Array.Sort(games, new CompareGamesOnId());
    

    【讨论】:

      【解决方案4】:

      您可以为此使用 1 班轮。 LINQ 适用于不影响集合的操作。

      gameConsoles.OrderBy(gc => gc.GameID).ToList().ForEach(g => g.display());
      

      【讨论】:

        【解决方案5】:

        在 Games 上实现 IComparable 并使用 .Sort 方法?IComparable

        【讨论】:

          【解决方案6】:

          您可以在不使用可怕的=&gt; 符号的情况下尝试 LINQ,当然,为了简单起见,不建议这样做。然而,这解释了=&gt; 到底在做什么,

          foreach (var item in gameConsole.OrderBy(delegate(Game g) { return g.GameId; }))
          {
              item.display();
          }
          

          【讨论】:

            猜你喜欢
            • 2019-12-17
            • 1970-01-01
            • 1970-01-01
            • 2020-05-24
            • 1970-01-01
            • 1970-01-01
            • 2017-05-07
            • 2015-08-30
            • 2010-09-10
            相关资源
            最近更新 更多