C# 布尔数组中的控制值

C# 布尔数组中的控制值,c#,arrays,linq,boolean,C#,Arrays,Linq,Boolean,bool[]isAvailable=新布尔值[5] 最初,im将数组中的所有值设置为true 我现在将(一次一个)值(随机选择)更改为false,如果存在3个以上的false值,我需要一种方法将其中一个false值恢复为true。 此外,不能是最后更改的值变为真 我正在使用LinQ和C#: 情景: [true,true,true,true,true] -> [true,true,true,true,false] -> [true,true,false,true,false] -&

bool[]isAvailable=新布尔值[5]

最初,im将数组中的所有值设置为true

我现在将(一次一个)值(随机选择)更改为false,如果存在3个以上的false值,我需要一种方法将其中一个false值恢复为true。 此外,不能是最后更改的值变为真

我正在使用LinQ和C#:

情景:

[true,true,true,true,true] -> [true,true,true,true,false] -> 

[true,true,false,true,false] -> [false,true,false,true,false] -> 

[false,true,true,true,false] -> [false,false,true,true,false] etc..

有人能解释一下如何操作吗?

与其直接更改索引值,不如将更改封装在助手方法中,然后该方法可以响应更改。您可以使用队列跟踪项目被设置为false的顺序,然后在队列达到一定大小后将其更改回原位

void Main()
{
    ShowArray();        //[True, True, True, True, True]
    ChangeValue(1);
    ShowArray();        //[True, False, True, True, True]
    ChangeValue(4);
    ShowArray();        //[True, False, True, True, False]
    ChangeValue(3);
    ShowArray();        //[True, False, True, False, False]
    ChangeValue(0);
    ShowArray();        //[False, True, True, False, False]
}

bool[] _array = {true,true,true,true,true};
Queue<int> _changed = new Queue<int>();
void ChangeValue(int index)
{
    if(_array[index]) // do nothing if it was already false
    {
        _array[index] = false;
        _changed.Enqueue(index);
        if(_changed.Count() > 3)
        {
            _array[_changed.Dequeue()] = true;
        }
    }
}

void ShowArray()
{
    Console.WriteLine("[" + string.Join(", ", _array) + "]");
}
void Main()
{
ShowArray();//[True,True,True,True,True]
变化值(1);
ShowArray();//[True,False,True,True,True]
变化值(4);
ShowArray();//[True,False,True,True,False]
变化值(3);
ShowArray();//[True,False,True,False,False]
变化值(0);
ShowArray();//[假,真,真,假,假]
}
bool[]_数组={true,true,true,true,true};
队列_changed=新队列();
无效值(整数索引)
{
if(_array[index])//如果已为false,则不执行任何操作
{
_数组[索引]=假;
_已更改。排队(索引);
如果(_changed.Count()>3)
{
_数组[_changed.Dequeue()]=true;
}
}
}
void ShowArray()
{
Console.WriteLine(“[”+string.Join(“,”,_数组)+“]”);
}

与其直接更改索引值,不如将更改封装在助手方法中,然后该方法可以响应更改。您可以使用队列跟踪项目被设置为false的顺序,然后在队列达到一定大小后将其更改回原位

void Main()
{
    ShowArray();        //[True, True, True, True, True]
    ChangeValue(1);
    ShowArray();        //[True, False, True, True, True]
    ChangeValue(4);
    ShowArray();        //[True, False, True, True, False]
    ChangeValue(3);
    ShowArray();        //[True, False, True, False, False]
    ChangeValue(0);
    ShowArray();        //[False, True, True, False, False]
}

bool[] _array = {true,true,true,true,true};
Queue<int> _changed = new Queue<int>();
void ChangeValue(int index)
{
    if(_array[index]) // do nothing if it was already false
    {
        _array[index] = false;
        _changed.Enqueue(index);
        if(_changed.Count() > 3)
        {
            _array[_changed.Dequeue()] = true;
        }
    }
}

void ShowArray()
{
    Console.WriteLine("[" + string.Join(", ", _array) + "]");
}
void Main()
{
ShowArray();//[True,True,True,True,True]
变化值(1);
ShowArray();//[True,False,True,True,True]
变化值(4);
ShowArray();//[True,False,True,True,False]
变化值(3);
ShowArray();//[True,False,True,False,False]
变化值(0);
ShowArray();//[假,真,真,假,假]
}
bool[]_数组={true,true,true,true,true};
队列_changed=新队列();
无效值(整数索引)
{
if(_array[index])//如果已为false,则不执行任何操作
{
_数组[索引]=假;
_已更改。排队(索引);
如果(_changed.Count()>3)
{
_数组[_changed.Dequeue()]=true;
}
}
}
void ShowArray()
{
Console.WriteLine(“[”+string.Join(“,”,_数组)+“]”);
}

是否必须随机选择更改回true的值的索引,或者它只能是最长为false的值?最好是最长为false的值如果您只想查找值为false的所有索引,请执行
var false index=Enumerable.Range(0,isAvailable.Length)。选择(i=>!i可用[i])
。但是您显示的代码中没有任何内容表明哪一个最长为假。是否必须随机选择将值更改回真的索引,或者它只能是假最长的值?如果您只想找到值为
fals的所有索引,则最好是假最长的索引e
,do
var-falseIndex=Enumerable.Range(0,isAvailable.Length)。选择(i=>!isAvailable[i])
。但是您显示的代码中没有任何内容表明哪一个最长时间为假。以前没有使用过队列。所以非常感谢您向我展示它,它工作得非常好。以前没有使用过队列。所以非常感谢您向我展示它,它工作得非常好