2017-07-26 106 views
1

所以我有CardBase抽象類和 我想提取一些隨機卡元素排除一些特定的卡列表。 所以我喜歡這個。如何從列表中選擇隨機元素排除某些列表?

public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList) 
{   
    var returnCards = from card in list 
           where !excludeList.Contains(card) 
           select card; 
    foreach (CardBase cd in returnCards.Take(elementsCount)) 
    { 
     Debug.Log("Selected random card is "+cd.name); 
    } 
    return (List<CardBase>) returnCards.Take(elementsCount); 
} 

我做對了嗎? 有沒有更好的辦法? 在此先感謝。


所以我改變了一點這樣。這似乎很有用。

public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList) 
{   
    var returnCards = from card in list 
           where !excludeList.Contains(card) 
           select card; 
    foreach (CardBase cd in returnCards.OrderBy(arg => Guid.NewGuid()).Take(elementsCount).ToList()) 
    { 
     Debug.Log("Selected random card is "+cd.name); 
    } 
    return returnCards.OrderBy(arg => Guid.NewGuid()).Take(elementsCount).ToList(); 
} 
+0

我想像你得到一些例外和/或不想要的結果與目前的做法列表。所以請添加一些小例子列表來顯示你想要的結果的所有方面。 – grek40

+0

我想如果你想使它隨機,你可能要考慮使用['System.Random類'](https://msdn.microsoft.com/en-us/library/system.random(v = vs .110).aspx#Anchor_4)生成一個隨機數,告訴你應該從剩餘列表項中取出多少個數字,並使用相同的類來生成每個從列表中選擇的數字的索引。 – Yatin

回答

1

你可以去LINQ的路線和使用Except提供CardBase有某種形式的平等的比較。其他方面,你可以使用過載,並提供一個IEqualityComparer<CardBase> comparer

從那裏你想從剩餘的可用卡隨機選擇卡。

static Random randomizer = new Random(); 
public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList) { 
    var availableCards = list.Except(excludeList).ToList(); 
    int count = Math.Min(elementsCount, availableCards.Count); 
    var selectedCards = new HashSet<CardBase>(); 
    do{ 
     var index = randomizer.Next(0, availableCards.Count); 
     var card = availableCards[index]; 
     selectedCards.Add(card); 
    } while (selectedCards.Count < count); 
    foreach (CardBase cd in selectedCards) { 
     Debug.Log("Selected random card is " + cd.name); 
    } 
    return selectedCards.ToList(); 
} 
+0

謝謝,所以有最簡單的關鍵字,除了。我現在使用的是Unity遊戲引擎,所以統一提供了Random.Range函數。那麼也許我不需要使用system.random()? – leegod

+0

我不熟悉Unity,所以我不能說。在你的問題中沒有跡象表明這與統一有關 – Nkosi

+0

看起來它允許重複選擇同一張卡片......我忽略了什麼嗎? – grek40

0

你會得到一個鑄造異常與你的代碼。

所以首先得到cardBase的IEnumerable

然後返回使用ToList()

public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList) 
     { 
      var returnCards = from card in list 
           where !excludeList.Contains(card) 
           select card; 
      foreach (CardBase cd in returnCards.Take(elementsCount)) 
      { 
       //Debug.Log("Selected random card is " + cd.name); 
      } 
      IEnumerable<CardBase> newList = returnCards.Take(elementsCount); 
      return newList.ToList(); 
     } 
+0

謝謝評論。 – leegod