2013-04-09 2 views
0

У меня есть собственный класс Deck, который наследует список с пользовательским классом Card.Преобразование унаследованного класса в настраиваемый

Код для Deck:

public class Deck : List<Card> 
     { 
      public void DrawCard(Deck d) 
      { 
       d.Add(this[0]); 
       this.RemoveAt(0); 
      } 
      public Deck(bool deckHasCards) 
      { 
       if (deckHasCards) 
       { 
        for (int i = 1; i <= 13; i++) 
        { 
         this.Add(new Card(i, Card.Suit.CLUBS)); 
         this.Add(new Card(i, Card.Suit.DIAMONDS)); 
         this.Add(new Card(i, Card.Suit.HEARTS)); 
         this.Add(new Card(i, Card.Suit.SPADES)); 
        } 
       } 
      } 
      public void Shuffle() 
      { 
       Random rng = new Random(); 
       int n = this.Count; 
       while (n > 1) 
       { 
        n--; 
        int k = rng.Next(n + 1); 
        Card value = this[k]; 
        this[k] = this[n]; 
        this[n] = value; 
       } 
      } 
     } 

и Card:

public class Card 
    { 
     public Suit s { get; set; } 
     public int num { get; set; } 
     public enum Suit 
     { 
      HEARTS, 
      DIAMONDS, 
      CLUBS, 
      SPADES 
     } 
     public Card(int number, Suit suit) 
     { 
      num = number; 
      s = suit; 
     } 

     public override String ToString() 
     { 
      return num + " of " + s.ToString().ToLower(); 
     } 
    } 

Все прекрасно работает, но если я хочу, чтобы выполнять какие-либо операции LINQ на Deck объекта, у меня нет никакого способа преобразования он возвращается к Deck. Есть ли (правильный) способ сделать это?

+0

Поскольку Linq является создание коллекций/новым вариантом перечислимых на лету, это имеет смысл. Сами запросы - это ссылки _not_ объекта на ваш оригинальный объект 'Deck'. Возможно, вы можете опубликовать пример кода/использования того, что вы делаете, или того, что вы хотели бы сделать. –

+0

@ChrisSinclair Я понимаю, что мой оригинальный объект не изменяется, я просто хотел бы, чтобы был способ преобразования объекта post-LINQ обратно в палубу. IE: 'deck = deck.Where (card => card.num == 2) .toDeck();' – Wilson

+0

Вы хотите, чтобы вы создавали _new_ колоду из некоторого набора карт (то есть новую 'Deck «что состоит из« 2 »-картов из вашей оригинальной« колоды »?) РЕДАКТИРОВАТЬ: Если да, то в порядке, если один и тот же объект« Карточка »может существовать одновременно в нескольких колодах? –

ответ

0

Вы можете добавить новый конструктор Deck:

public Deck(bool deckHasCards, IEnumerable<Card> cards) 
{ 
    foreach (Card c in cards) 
     this.Add(c); 
} 

и использовать такую ​​строку:

var deck = new Deck(deckHasCards: true, cards: deck.Where(card => card.num == 2)); 
Смежные вопросы