【发布时间】: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 => card.num == 2).toDeck(); -
你的意思是你想用一组卡片创建一个新套牌(即一个新的
Deck,它由来自的“2”张卡片组成你原来的deck?)编辑:如果是这样,如果同一个Card对象可以同时存在于多个甲板上,可以吗? -
好吧,出于所有意图和目的,是的。抱歉,将同一个对象设置为新对象,这太愚蠢了——可能令人困惑。
-
您可能希望抽象出您在甲板上执行的操作。在任何地方使用
List<Card>或IEnumerable<Card>而不是Deck,然后使Shuffle和DrawCard成为DeckOperations类或在IEnumerable<Card>上运行的扩展方法的一部分。
标签: c# linq class inheritance type-conversion