2014-01-12 73 views
0

我是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; 
     } 


    } 
} 

回答

2

您可以使用LINQ OrderBy擴展方法對卡片進行排序。我假設你想讓你的卡片根據他們的SortNumber屬性進行分類。

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

編輯:關於第二個想法,你應該做收起你們的shuffle方法(和SortNumber屬性),並使用從this answer提供的第一個擴展方法,它是基於Fisher–Yates shuffle。您可以通過調用它:

return pirateCards.Shuffle(); 
+0

非常感謝您的快速反應。我一直在嘗試像這樣的事情,而且做到了。但是我得到...沒有將對象引用設置爲對象的實例。 – user3187383

+0

@ user3187383:是的,那是因爲你的數組是一個大於卡片數量的元素(所以最後一個項目仍爲'null')。用'新的PirateCard [dt.Rows.Count]'替換'新的PirateCard [dt.Rows.Count + 1]'。 – Douglas

0

如果你想堅持的陣列,還有Array.Sort方法的不同重載。有些需要比較作爲參數,例如:

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

順便說一句,你的數組是一個大的元素;如下,以避免一個NullReferenceException排序時,你應該初始化:

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

另外,cardCount需要被爲0的值作爲陣列在.NET 0開始initilized。

+0

非常感謝這兩個。我一直在擺弄數組的初始化和增量,現在我已經改變了代碼來啓動數組爲0(cardCount),並且避免了在不同點上加1或減1的需要。簡單得多! – user3187383

0

您可以使用"LinQ to SQL Classes"節省大量時間,將數據庫錶轉換爲類。然後你可以用簡單的代碼對你的數組進行排序和分組。

+0

我確實看到了一些關於LINQ的內容,並會進行調查,謝謝。 – user3187383

相關問題