【问题标题】:Going all over a list and checking if boolean property are in the list遍历列表并检查布尔属性是否在列表中
【发布时间】:2014-03-06 06:11:12
【问题描述】:

我正在使用 C# 在控制台模式下编写战舰。 当我放下我的船时,它们会相互交叉,所以我有一个类案例(棋盘的均方)和一个包含布尔属性 Used 的 Listposition。

这是部分代码:

bool isok;
do
{
    isok = true;
    Console.WriteLine("Donner la position du haut de votre " + bat.Name + " en X");
    int y = int.Parse(Console.ReadLine());
    Console.WriteLine("Donner la position du haut du navire en Y");
    int x = int.Parse(Console.ReadLine());
    Console.WriteLine("Positionnement Vertical (1) ou Horizontal (2) ");                  
    int direction = int.Parse(Console.ReadLine());

    var essay = b1.Position.Select(e=>e.Used);

    bool overlap = false;
    for (int i = y; i <= y + bat.Size - 1; i++)
        overlap = overlap || b1.Position.Exists(c => c.Y == y && c.X == x && c.Used);

    switch (direction)
    {
        case 2:
        {
            if ((y + bat.Size - 1 > 9) || overlap)
            {
                isok = false;
            }  

            {
                isok = false;
            }  
            else
            {
                for (int i = y; i <= y + bat.Size-1 ; i++)
                {

                    b1.Position.Add(new cases(x, i, true, false, false, false));
                    b1.changetype(x, i);
                    b1.changeUsed(x, i);
                    b2.changetype(x, i);

                }
            }       
            break;
        }
    }
}

public cases(int x , int y, bool target, bool touch, bool played, bool used)
{
    this.x = x;
    this.y = y;
    this.target = target;
    this.touch = touch;
    this.played = played;
    this.used = used;
}

public void changetype(int x,int y)
{           
        vue[x, y].Target = true;
}

public void changeUsed(int x, int y)
{
    vue[x, y].Used = true;
}

public List<cases> Position
{
    get
    {
        return position;
    }
    set
    {
        position = value;
    }
}

它是法语,但它只是要求输入两个坐标(x 和 y)来获取船的起始位置。我的问题是我可以在if 条件下使用哪种可扩展方法?事实上,我希望在放置船之前阅读的列表在 if 行中有一个保留帮助我填写。

【问题讨论】:

    标签: c# linq list extension-methods conditional-statements


    【解决方案1】:

    我认为 List.Exists() 是您正在寻找的。​​p>

    Position.Exists(c => c.used)

    编辑: 我认为在 if 语句之前需要一个 for 循环来记录是否有任何重叠。

    bool overlap = false;
    for (int i = y; i <= y + bat.Size-1; i++)
        overlap = overlap || Position.Exists(c => c.y == y && c.x == x && c.used);
    

    然后,在 if 条件中使用重叠。

    编辑: 我在循环中犯了一个错误。

    bool overlap = false;
    for (int i = y; i <= y + bat.Size-1; i++)
        overlap = overlap || Position.Exists(c => c.y == i && c.x == x && c.used);
    

    此代码的作用是检查您的船需要的任何空间是否已在使用并记录是否已使用。如果你更容易阅读,这和上面的一样:

    bool overlap = false;
    for (int i = y; i <= y + bat.Size-1; i++)
        if (Position.Exists(c => c.y == i && c.x == x && c.used))
            overlap = true;
    

    另外,这段代码应该在 case 2 之内和 if 语句之前。

    【讨论】:

    • 我试过了,但我的船还在过境,也许我用得不好?
    • 谢谢,但我不明白你写的代码重叠只是一个布尔值,所以它是真还是假我不明白 de bouble pipe 它不是“或”吗?我复制粘贴但仍然无法正常工作
    • 双管道是或。你把这段代码放在 if 语句上面,把 if 语句改成 if ((y + bat.Size-1 > 9) ||overlap)
    • 我尝试过这种方式,但它仍然无法正常工作,但我的船有很多情况,所以即使你检查第一个重叠只有一个值,测试应该在很多情况下进行,所以我明白de for 循环,但它没有将所有位置记录在一个变量中
    • 我差不多明白了,但我不应该把条件行 c.Used == true 放在里面吗?而在第二个条件下,我必须使用重叠是如果 ((y + bat.Size - 1 > 9) || 重叠) 足够?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2019-04-09
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多