如何对类对象数组进行排序?

时间:2014-01-12 13:55:44

标签: c# class sorting object

我是c#的新手并试图以正确的方式做到这一点。我已经搜索了stackoverflow并咨询了教程和书籍重新排序类对象,但还没有找到任何适合我的东西,尽管与LISTS,INUMERATORS和COMPARATORS挣扎。为了帮助我学习c#,我试图复制一个旧的棋盘游戏。它包括在新游戏开始时需要分类或洗牌的牌。我通过SQL Server的存储过程获取卡数据,因为我也试图掌握它。我怎样才能简单地对我的卡类对象进行排序并从下面的函数中返回它们?我是否以最好的方式完成这项任务?下面是我的'PirateCard'课程。非常感谢。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Collections;

namespace Buccaneer
{
    public class PirateCard : Card
    {


        public PirateCard()
        {
        }

        public PirateCard[] initCards()
        {
            string spName = "sp_select_cards_by_type";
            int cardCount = 1;
            db DB = new db();
            DataTable dt = new DataTable();

            Dictionary<string, string> spParams = new Dictionary<string, string>();
            spParams.Add("@Type", "PIRATE");

            dt = DB.executeSelectStoredProcedureWithParams(spName, spParams);
            PirateCard[] pirateCards = new PirateCard[dt.Rows.Count + 1];

            List<int> sortNumber = shuffle();
            Console.WriteLine(sortNumber.Count);

            foreach (DataRow row in dt.Rows)
            {
                pirateCards[cardCount] = new PirateCard();
                pirateCards[cardCount].Type = row["fldtype"].ToString();
                pirateCards[cardCount].Number = row["fldno"].ToString();
                pirateCards[cardCount].SortNumber= sortNumber.ElementAt(cardCount - 1);
                pirateCards[cardCount].IncentiveType = row["fldincentivetype"].ToString();
                pirateCards[cardCount].Value = row["fldvalue"].ToString();
                pirateCards[cardCount].PlayWithin = row["fldplaywith"].ToString();
                pirateCards[cardCount].Text = row["fldtext"].ToString();           
                Console.WriteLine(pirateCards[cardCount].Number + ":" + pirateCards[cardCount].SortNumber);
                cardCount++;
            }
            Console.WriteLine(DB.RecordCount + " pirate cards were found.");
            //  SHUFFLE OR SORT CARDS on .SortNumber here...
            //  ???
            return pirateCards;
        }

        public List<int> shuffle()
        {
            Random randNum = new Random();
            List<int> numbers = new List<int>();
            while (numbers.Count < ApplicationGlobals.numberOfPirateCards)
            {
                int num = randNum.Next(1, ApplicationGlobals.numberOfPirateCards + 1);
                if (numbers.Contains(num))
                {                    
                }
                else
                {
                    numbers.Add(num);
                    Console.WriteLine(num + " Numbers allocated so far " + numbers.Count);
                }
            }
            Console.WriteLine(numbers.Count + " random numbers allocated");
            return numbers;
        }


    }
}

3 个答案:

答案 0 :(得分:2)

您可以使用LINQ OrderBy扩展方法对卡片进行排序。我假设您希望根据SortNumber属性对卡进行排序。

return pirateCards.OrderBy(card => card.SortNumber).ToArray();

修改:再想一想,您应该取消shuffle方法(和SortNumber属性),并使用{{3}提供的第一种扩展方法},它基于this answer。您可以使用以下方式调用它:

return pirateCards.Shuffle();

答案 1 :(得分:0)

如果您想坚持使用数组,Array.Sort方法会有各种重载。有些人将比较作为参数,例如:

Array.Sort(pirateCards, (x, y) => x.SortNumber - y.SortNumber);

顺便说一句,你的数组是一个大元素;你应该按如下方式初始化它,以避免在排序时出现NullReferenceException:

PirateCard[] pirateCards = new PirateCard[dt.Rows.Count];

此外,cardCount需要使用值0来初始化,因为数组在.NET中以0开头。

答案 2 :(得分:0)

使用"LinQ to SQL Classes"可以将数据库表转换为类,从而节省大量时间。然后,您可以用简单的代码对对象数组进行排序和分组。