比较单个列表中的多个对象

时间:2018-08-18 16:48:20

标签: c# c#-4.0

这可能是重复的,但我现在已经找了几个小时,而且我一直很忙。所以去了:

I don't have any code yet. I got p*ssed and deleted most of it! :P

我正在编写一个简单的程序,它将从一副纸牌中抽出五张纸牌。现在,我可以做。但是,我正在制作一个按钮,该按钮将继续从新的纸牌开始绘制,直到碰到一对为止。

现在的问题是对五张抽签的比较。我正在从列表中提取它们

List<Card> TheDeck

并将它们添加到另一个列表

List<Card> TheHand

卡片类非常简单,只包含西装的第一个字母和一个数字。

public string suit;
public int number;
public Card(string suit, int number)
{
    this.suit = suit;
    this.number = number;
}

现在要画一对,我必须比较五张被抽出的牌的数量,看它们是否匹配。我这样做的最后一种方法是执行GIANT if语句,

if (TheHand[0].number == TheHand[1].number || 
TheHand[0].number == TheHand[2].number || TheHand[0].number == TheHand[3].number || 
TheHand[0].number == TheHand[4].number /* .. and so on and so on .. */)

我可以这样做,但是似乎太过分了。 所以你有我的问题。比较所有卡的更简单方法是什么?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您还可以使Card类从IEqutable继承,并使用Equals方法,定义如何确定两张卡是否成对,然后按照Selman的建议使用Linq.GroupBy,但是这次不为groupBy指定任何条件。 return await 下面的代码以及一些测试方法:

input.GroupBy(c => c).Where(g => g.Count() > 1)

答案 1 :(得分:0)

您可以按编号对卡进行分组,并检查是否有一组卡不止一张:

TheHand.GroupBy(c => c.number).Any(g => g.Count() > 1)

要选择匹配的卡,您可以使用Where

TheHand.GroupBy(c => c.number).Where(g => g.Count() > 1).SelectMany(g => g);

答案 2 :(得分:0)

根据您所创建的游戏,您可以独立评估卡牌。目前,通过数字比较卡,请参阅详细信息:https://docs.microsoft.com/en-us/dotnet/api/system.icomparable?redirectedfrom=MSDN&view=netframework-4.7.2

CardComparer可用于对牌进行排序,我先对西服排序,然后对数字进行排序,具体取决于您可能决定更改此游戏的游戏,请记住,在比较牌时,您始终会比较2个,因此比较规则是很好地包含在其中的Compare方法中。

在手上添加项目时,可以使用以下内容:

int index = TheHand.BinarySearch(newCard);
if (index>-1) //now a card with same number is found and you can take action
else
TheHand.Add(newCard);

这是课程代码:

public class Card : IComparable<Card>
        {
            public Card(string suit, int number)
            {
                this.Suit = suit;
                this.Number = number;
            }

            public string Suit { get; }
            public int Number { get; }

            public int CompareTo(Card other)
            {
                return Number.CompareTo(other.Number);
            }
        }

另外,因此您可以更好地理解该概念:对于排序,请使用:TheHand.Sort(new CardComparer());

        public class CardComparer : IComparer<Card>
        {
            public int Compare(Card x, Card y)
            {
                int compResult = x.Suit.CompareTo(y.Suit);
                if (compResult == 0)
                {
                    compResult = x.Number.CompareTo(y.Number);
                }
                return compResult;
            }
        }

注意:当黑桃皇后最强时,可以将此逻辑添加到比较器中。例如。您可以制作一个游戏比较器,用于比较桌上的纸牌。