【问题标题】:Converting inherited class to a custom one将继承的类转换为自定义类
【发布时间】:2013-04-01 11:21:37
【问题描述】:

我有一个自定义 Deck 类,它继承了一个带有自定义 Card 类的 List。

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();
        }
    }

一切都很好,但是如果我想对 Deck 对象执行任何 LINQ 操作,我无法将其转换回 Deck。有没有(正确的)方法可以做到这一点?

【问题讨论】:

  • 由于 Linq 正在动态创建 new 集合/可枚举,这是有道理的。查询本身是 not 对原始 Deck 对象的对象引用。也许您可以发布一些示例代码/您正在做的事情或您想做的事情。
  • @ChrisSinclair 我知道我的原始对象没有被更改,我只是想有一种方法将后 LINQ 对象转换回甲板。即:deck = deck.Where(card =&gt; card.num == 2).toDeck();
  • 你的意思是你想用一组卡片创建一个套牌(即一个新的Deck,它由来自的“2”张卡片组成你原来的deck?)编辑:如果是这样,如果同一个Card对象可以同时存在于多个甲板上,可以吗?
  • 好吧,出于所有意图和目的,是的。抱歉,将同一个对象设置为新对象,这太愚蠢了——可能令人困惑。
  • 您可能希望抽象出您在甲板上执行的操作。在任何地方使用List&lt;Card&gt;IEnumerable&lt;Card&gt; 而不是Deck,然后使ShuffleDrawCard 成为DeckOperations 类或在IEnumerable&lt;Card&gt; 上运行的扩展方法的一部分。

标签: c# linq class inheritance type-conversion


【解决方案1】:

你可以给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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2021-09-26
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多