Я новичок в 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»). Замените 'new PirateCard [dt.Rows.Count + 1]' на 'новый PirateCard [dt.Rows.Count]'. – Douglas