C# 如何查看值是否包含在数组或类中?

C# 如何查看值是否包含在数组或类中?,c#,data-structures,storage,C#,Data Structures,Storage,我正在玩21点游戏。我需要确定我的牌组是否包含特定值 检查我的甲板最简单的方法是什么。最简单的意思是更少的代码行和更少的混乱。注:我将给出这些值的相关字符串。(国王、杰克、王后和十等于十。) 这不涉及任何关于西装或颜色的问题。我将只显示卡符号(K,Q) 使用枚举: public enum Value { V2, V3, //... V10, J, Q, K, A } public enum Suit { Diamonds,

我正在玩21点游戏。我需要确定我的牌组是否包含特定值

检查我的甲板最简单的方法是什么。最简单的意思是更少的代码行和更少的混乱。注:我将给出这些值的相关字符串。(国王、杰克、王后和十等于十。)

这不涉及任何关于西装或颜色的问题。我将只显示卡符号(K,Q)


使用
枚举

public enum Value
{
    V2,
    V3,
    //...
    V10,
    J,
    Q,
    K,
    A
}
public enum Suit
{
    Diamonds,
    Spades,
    Hearts,
    Clubs
}

public static bool ContainsCard(IEnumerable<Tuple<Suit,Value>> deck, Suit suit, Value value)
{
    return deck.Any(c => c.Item1 == suit && c.Item2 == value);
}
公共枚举值
{
V2,
V3,
//...
V10,
J
Q
K
A.
}
公开枚举诉讼
{
钻石,
黑桃,
心,
俱乐部
}
公共静态bool CONTANSCARD(IEnumerable甲板、套装、价值)
{
返回甲板。任意(c=>c.Item1==suit&&c.Item2==value);
}

解决这个问题有很多可以接受的方法。我尝试的一种方法是制作两种类型的enum,并为每张卡分配它们。比如说,

public enum CardNumber { Ace, Two, Three, ... Ten, Jack, Queen, King };
public enum CardSuit { Diamond, Heart, Club, Spade};

创建这两种类型后,您可以为制作的每张卡声明上述每种类型中的一种。此时,这些卡可以很容易地存储在您首选的系统中,例如阵列或列表

我会用一个枚举表示等级,另一个枚举表示西装

然后将它们封装在
类中,如下所示:

public enum Suit
{
    Clubs,
    Diamonds,
    Hearts,
    Spades
}

public enum Rank
{
    Ace = 1,
    One,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King
}

public class Card: IEquatable<Card>
{
    public Rank Rank
    {
        get; 
        set;
    }

    public Suit Suit
    {
        get; 
        set;
    }

    public int Value
    {
        get
        {
            switch (Rank)
            {
                case Rank.Ten:
                case Rank.Jack:
                case Rank.Queen:
                case Rank.King:

                    return 10;

                default:

                    return (int) Rank;
            }
        }
    }
}
请注意如何使用
deck.Contains(target)
查看该牌组是否包含特定的卡

我们还可以使用
IndexOf(target)
来准确地找到卡片在卡片组中的位置

还要注意我们如何实现卡的
属性

我们不需要显式存储此值,因为您可以从卡的等级中派生它

看看我们如何返回10、jack、Queen和King的显式值。对于其他值,我们利用以下事实:列组的枚举值从1开始表示Ace,从2开始表示2,依此类推。这意味着我们可以简单地将枚举转换为int以获得正确的值


在此基础上,创建一个<代码>甲板>代码>一个<代码>手> /Case>类可以更容易地模拟卡片和一手牌,也可以做像拖曳甲板之类的事情。(怎么做超出了这个特定问答的范围。)

考虑使用两种可枚举类型,一种用于西装,一种用于数字。@Doc:你是说
Enum
s,它们与
Enumerable
静态类或
IEnumerable
接口完全无关。@SLaks啊,多年的经验,却从未意识到这一点。很高兴你指出了这一点,我需要重新思考我的生活。到目前为止,你尝试了什么?您目前如何存储您的卡?你的
课程是什么样子的?关于这个问题有很多相关的信息。有很多不同的数据结构,大多数都可以被搜索。因为您不太可能拥有非常大的数据集,所以不需要担心效率。试一试;看看会发生什么。如果你有困难,可以尝试一下,看看别人的解决方案。如果您仍然无法使其工作,请在此处发布您的代码。@Mr.Bottell我不确定您的回复。你是说你的老师禁止你学习更多的编程知识吗?如果是这样的话,那就抛弃他,找一个更好的老师,他明白,自学新的编程概念是所有开发人员从一开始就需要掌握的一项重要技能。如果这不是您要说的,请澄清您的意思。这不是显示如何搜索数据结构,而是显示如何表示
卡。这是一个错误。数字文字不允许作为枚举成员标识符。这就是为什么你不应该编辑我的问题,这里的第二个代码框太混乱了,包含不相关的诉讼。但是谢谢你trying@Mr.Bottell“不应该编辑我的问题”是什么意思?我没有编辑你的问题!不管怎么说,如果你觉得这太令人困惑,并且没有准备好学习基本的东西,你就没有希望写一个21点游戏;我建议你去做一些不那么累人的事情。对不起,不是你,这是为了服务
Value
可以实现为
Math.Min(10,Rank)
而不是一个开关。@Mr.Bottell我很有信心,即使我没有编辑你的“我是个新手”不要提你的问题,这不会改变马特的答案。当它仍然是你问题的合适解决方案时,它并没有变得比这更基本。
public enum Suit
{
    Clubs,
    Diamonds,
    Hearts,
    Spades
}

public enum Rank
{
    Ace = 1,
    One,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King
}

public class Card: IEquatable<Card>
{
    public Rank Rank
    {
        get; 
        set;
    }

    public Suit Suit
    {
        get; 
        set;
    }

    public int Value
    {
        get
        {
            switch (Rank)
            {
                case Rank.Ten:
                case Rank.Jack:
                case Rank.Queen:
                case Rank.King:

                    return 10;

                default:

                    return (int) Rank;
            }
        }
    }
}
List<Card> deck = new List<Card>();

deck.Add(new Card {Rank = Rank.Seven, Suit = Suit.Clubs} ); 
deck.Add(new Card {Rank = Rank.Five,  Suit = Suit.Diamonds} );

Card target1 = new Card {Rank = Rank.Five,  Suit = Suit.Diamonds };
Card target2 = new Card {Rank = Rank.Eight, Suit = Suit.Hearts };

Console.WriteLine(deck.Contains(target1)); // Prints true
Console.WriteLine(deck.Contains(target2)); // Prints false

Console.WriteLine(deck.IndexOf(target1)); // Prints 1