我是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;
}
}
}
非常感謝您的快速反應。我一直在嘗試像這樣的事情,而且做到了。但是我得到...沒有將對象引用設置爲對象的實例。 – user3187383
@ user3187383:是的,那是因爲你的數組是一個大於卡片數量的元素(所以最後一個項目仍爲'null')。用'新的PirateCard [dt.Rows.Count]'替換'新的PirateCard [dt.Rows.Count + 1]'。 – Douglas