【问题标题】:How to creare ArrayList and skip it through the loop如何创建 ArrayList 并在循环中跳过它
【发布时间】:2021-11-29 19:22:45
【问题描述】:

我想写一个卡片交换游戏。我有一个颜色数组列表,其中值从 -1 到 6 开始。这个数组的每个元素都意味着 id 颜色。还有一个 ArrayList Player Properties,其中存储有颜色的卡片。我需要创建一个带有八个零的 ArrayList,这将暗示 id 颜色。接下来,通过该数组跳过 ArrayList Player Properties,如果数组中有元素,则将 ArrayList Colors 索引增加 +1。

例如:

ArrayList Colors =new ArrayList(){-1,0,1,2,3,4,5,6};
ArrayList Player Properties = new ArrayList(){0,4,6};
This array should imply that its element is an element of the Colors array
ArrayList buffer = new ArrayList(){0,0,0,0,0,0,0,0};
If an array comes to the input in this form: {0,4,6};
Then the index of this array is added by +1, like this: {0,1,0,0,0,1,0,1}; 

如何在代码中实现这一点?

我没有任何代码示例,因为我不知道如何实现它,提前抱歉我没有提供更多代码,我真的需要帮助,提前谢谢大家的帮助

【问题讨论】:

  • ArrayList 现在非常非常老了;您使用它有什么特别的原因吗?
  • @CaiusJard 没有具体原因
  • 为什么{0,1,0,0,0,1,0,1,0,0}中有10个元素?
  • @CaiusJard 这是一个错误,我已经解决了这个问题

标签: c#


【解决方案1】:

您可以使用 Linq 函数 Contains 检查数组中是否存在值。像这样的:

    var colors = new int[] { -1, 0, 1, 2, 3, 4, 5, 6 };
    var playerProperties = new int[] { 0, 4, 4, 6 };
    var result = colors.Select(c => playerProperties.Where(x => x == c).Count());
    Console.WriteLine(string.Join(", ", result));

打印0, 1, 0, 0, 0, 2, 0, 1

【讨论】:

  • 我认为目的是在属性匹配的位置值中继续添加 1。所以下一次结果可能是例如0, 1, 0, 0, 1, 2, 0, 2,如果{3, 4, 6}的属性。
  • @JAlex 是的,如果突然出现一个包含 {1,1,2,4} 的数组,第一个的索引会变成两个吗?如果有重复,我需要在这种情况下增加
  • @JAlex 是否可以修改此选项为我工作?我了解您需要正确执行所有操作,但是如何根据现有数据执行此功能?如果我开始做所有事情都正确,那么过程中可能会出现一些问题,然后重做很多
  • @YamaLomama 我更新了答案以给出 playerProperties 中的出现次数
  • @HansKilian 非常感谢!这个解决方案非常适合我。我很高兴世界上有你这样的人!祝你好运!你是最棒的!
【解决方案2】:

你想要的是你积累的卡值的histogram

由于这是 C#,因此您最好开始为每个玩家考虑数据模型。有两个数组需要考虑,一个包含卡片值:-1,0,..6,另一个包含卡片计数,即玩家每张卡片的数量。

这将如何发挥作用:

static class Program
{
    static void Main(string[] args)
    {
        var player1 = new Player("Player1");

        Console.WriteLine(player1);            
        // Player1 : 0,0,0,0,0,0,0,0

        player1.Hand(0,4,6);
        Console.WriteLine(player1);
        // Player1: 0,1,0,0,0,1,0,1
    }
}

您可以使用以下处理.Hand() 方法内部逻辑的Player 类。

public class Player
{
    public static readonly int[] CardValues = { -1, 0, 1, 2, 3, 4, 5, 6 };
    public Player(string name)
    {
        CardCounts = new int[CardValues.Length];
        Name = name;
    }
    public int[] CardCounts { get; }
    public string Name { get; }
    public void Hand(params int[] cards)
    {
        foreach (var card in cards)
        {
            int index = Array.IndexOf(CardValues, card);
            if (index >= 0)
            {
                CardCounts[index] += 1;
            }
        }
    }
    public override string ToString()
    {
        return $"{Name} : {string.Join(",", CardCounts)}";
    }
}

请注意,ArrayList 是一种非常古老的技术,并且不是类型安全的。在它的位置有List<>,但在这种情况下,数组的长度是固定的,因为有一组有限的卡值,并且不会改变,所以不需要集合,就像一个普通的旧Array就够了。

【讨论】:

  • 而不是安全输入 - 好吧,这不是真的..
  • @CaiusJard 你可以告诉我如何正确地做,只是写评论不是最好的事情,我是初学者,我可能无法理解 cmets 中写的所有内容
  • 我并不是说 JAlex 的答案是错误的,只是说 ArrayList 不是类型安全的有点误导。我同意不应该使用 ArrayList。我对答案的主要内容没有任何问题,虽然我想我会有点捷径。
  • @YamaLomama - 要做到“正确”,这里还有很多事情可以做。一方面,我会放弃整数来区分卡片颜色,并用这些值定义一个enum。然后System.Enum 下的方法允许您在符号、整数和字符串之间进行转换。添加[Description()] 属性,您就可以在 UI 中使用用户可读的字符串。
  • @CaiusJard - ArrayList 类型如何安全?它将所有内容都转换为object,甚至是值类型,由消费者手动处理类型转换。
【解决方案3】:

因为你的数组是一个固定的表示:

var Colors = new []{-1,0,1,2,3,4,5,6};
var PlayerProperties = new []{0,4,6};
var buffer = new []{0,0,0,0,0,0,0,0};

您可以计算缓冲区中的哪些索引应设置为 1

foreach(var pp in PlayerProperties)
  buffer[pp+1] += 1;

值 0 总是出现在索引 1 处。值 4 总是出现在索引 5 处。值 6 总是出现在索引 7 处。因此公式是 value+1..

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2019-05-08
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多