减少数组中的最后一个字符串元素而不在C#中删除它?

Posted

技术标签:

【中文标题】减少数组中的最后一个字符串元素而不在C#中删除它?【英文标题】:Decrementing last string element in array without removing it in C#? 【发布时间】:2021-03-12 20:25:57 【问题描述】:

我目前正在 Unity 上做一个演示,我将整个字母表放在一个数组中。对于退格函数,我想减少数组中的最后一个字符串元素,但它不起作用。

[SerializeField] private GameObject keyboard;

[SerializeField] private Text keyboardInput;

private KeyCode[] MyKeys = KeyCode.A, KeyCode.B,KeyCode.C,KeyCode.D, KeyCode.E,KeyCode.F,KeyCode.G,KeyCode.H,KeyCode.I,KeyCode.J,KeyCode.K,KeyCode.L,KeyCode.M,KeyCode.N,KeyCode.O,KeyCode.P,KeyCode.Q,KeyCode.R,KeyCode.S,KeyCode.T, KeyCode.U ,KeyCode.V,KeyCode.W,KeyCode.X,KeyCode.Y,KeyCode.Z, KeyCode.Space, KeyCode.Backspace ;

private string[] currText;
void Start()

    keyboardInput.text = currText.ToString();


private void typeKeys()


    for (var i = 0; i < MyKeys.Length; i++)
    

        if (Input.GetKeyDown(MyKeys[i]))
        

            if (i == 0)
            
                keyboardInput.text += "a";
            
            else if (i == 1)
            
                keyboardInput.text += "b";
            
            else if (i == 2)
            
                keyboardInput.text += "c";
            
            else if (i == 3)
            
                keyboardInput.text += "d";
            
            else if (i == 4)
            
                keyboardInput.text += "e";
            
            else if (i == 5)
            
                keyboardInput.text += "f";
            
            else if (i == 6)
            
                keyboardInput.text += "g";
            
            else if (i == 7)
            
                keyboardInput.text += "h";
            
            else if (i == 8)
            
                keyboardInput.text += "i";
            
            else if (i == 9)
            
                keyboardInput.text += "j";
            
            else if (i == 10)
            
                keyboardInput.text += "k";
            
            else if (i == 11)
            
                keyboardInput.text += "l";
            
            else if (i == 12)
            
                keyboardInput.text += "m";
            
            else if (i == 13)
            
                keyboardInput.text += "n";
            
            else if (i == 14)
            
                keyboardInput.text += "o";
            
            else if (i == 15)
            
                keyboardInput.text += "p";
            
            else if (i == 16)
            
                keyboardInput.text += "q";
            
            else if (i == 17)
            
                keyboardInput.text += "r";
            
            else if (i == 18)
            
                keyboardInput.text += "s";
            
            else if (i == 19)
            
                keyboardInput.text += "t";
            
            else if (i == 20)
            
                keyboardInput.text += "u";
            
            else if (i == 21)
            
                keyboardInput.text += "v";
            
            else if (i == 22)
            
                keyboardInput.text += "w";
            
            else if (i == 23)
            
                keyboardInput.text += "x";
            
            else if (i == 24)
            
                keyboardInput.text += "y";
            
            else if (i == 25)
            
                keyboardInput.text += "z";
            
            else if (i == 26)
            
                keyboardInput.text += " ";
            
            else if (i == 27)
            
                currText = currText.Take(currText.Length - 1).ToArray();
            
        
    ;


// Update is called once per frame
void Update()


    typeKeys();

这是我要开始工作的部分

                else if (i == 27)
            
                currText = currText.Take(currText.Length - 1).ToArray();
            

See video for clarification

我的意思是说它不起作用是我不能从我的数组中删除最后一个字母,因此在我的虚拟设置中的句子中使用退格键。这是整个脚本。

【问题讨论】:

“它不起作用”是什么意思? 我从你的代码中看到的只是你总是添加到你的“keyboardInput”变量中。您在哪一点添加到“currText”变量中?从你的代码我可以说它总是一个空字符串。 【参考方案1】:

让我们从减少代码量开始。然后,在那之后,我们还可以利用两个事实; Unity 有一个 KeyCode 枚举,字母表按从 'a' 到 'a'+25 的值排序。我会用一些代码来澄清这一点:

private Text keyboardInput;
List<char> charList = new List<char> ( );

private void typeKeys( )

    var length = charList.Count;

    if ( Input.GetKeyDown ( KeyCode.Space ) )
        charList.Add ( ' ' );

    if ( Input.GetKeyDown ( KeyCode.Backspace ) && length  > 0 )
        charList.RemoveAt ( length - 1 );

    for ( var i = 0; i < 26; i++ )
        if ( Input.GetKeyDown ( KeyCode.A + i ) ) charList.Add ( ( char ) ( 'a' + i ) );

    if ( length != charList.Count ) keyboardInput.text =  string.Concat ( charList );

我在这里所做的是首先检查 Space 键,然后是 Backspace 键。之后,我遍历字母字符,将i 值添加到KeyCode.A。请记住,默认情况下枚举只是int。如果匹配,我们将相应的 i 值添加到 'a' 字符并将其添加到 List&lt;char&gt; 列表中,记住还要先将结果值转换回 char

最后,如果您的字符数组的长度发生了变化,那么,也只有到那时,我们才会更新您的keyboardInput.text。这是为了帮助节省每帧产生的字符串垃圾。我们可以将Concat 一个char IEnumerable 转换为一个string

使用此方法,您可以删除以private KeyCode[] MyKeys 开头的整行。您无需将所有 KeyCode 值存储在一个数组中以进行检查。

【讨论】:

哇!多么棒的解决方案!我对 C# 还很陌生,所以我之前没有使用枚举或 List 系统的经验。我习惯于只在数组范围内工作,但这令人大开眼界:)。谢谢您的帮助!由于我正在尝试实现 det å、ä、ö 键(此演示基于瑞典键盘),因此还有很多工作要做,但这是一个很好的开始。再次感谢!【参考方案2】:

这不是您问题的答案,要获得正确的答案,您需要发布完整的代码并很好地解释问题所在,但我想我会发布这个,因为它可能有用给你。

我已经重构了你的typeKeys() 方法。

private void typeKeys()

    foreach (var key in MyKeys.Where(k => k != KeyCode.Space).Where(k => k != KeyCode.Backspace))
    
        if (Input.GetKeyDown(key))
        
            keyboardInput.text += key.ToString().ToLower();
        
    
    if (Input.GetKeyDown(KeyCode.Space))
    
        keyboardInput.text += " ";
    
    if (Input.GetKeyDown(KeyCode.Backspace))
    
        currText = currText.Take(currText.Length - 1).ToArray();
    

就是这样。

currText = currText.Take(currText.Length - 1).ToArray(); 行应该可以将正确定义的数组截断一个元素或简单地将其保持为零元素。

【讨论】:

可读性更强。我确实认为它需要if (Input.GetKeyDown(key)) 块中的条件来处理k == KeyCode.Space 的情况

以上是关于减少数组中的最后一个字符串元素而不在C#中删除它?的主要内容,如果未能解决你的问题,请参考以下文章

获取数组的最后一个元素而不删除它的最佳方法是啥?

C#中删除字符串最后一个字符串的几种方式

C#字符串数组替换最后一个元素

从C#中的数组中删除指定元素的几种方法,超简单

像 C# 中的另一个数组一样订购一个数组

java中怎么删除数组中的元素?