遍布列表并检查布尔属性是否在列表中

时间:2014-02-08 20:18:13

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

我用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行中有一个帮助我填写。

1 个答案:

答案 0 :(得分:0)

我认为List.Exists()就是你要找的。

Position.Exists(c =&gt; 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;

此外,此代码应位于案例2内和if语句之前。