Home > OS >  Array.Contains() is always false
Array.Contains() is always false

Time:06-05

I've been smashing my head against this problem for days and have tried a tons of different things. I've been all over the forums, tried everything I've seen with no luck. My issue could be that I don't have an override, but I can't figure out how to get that to work.

I want to check if an array of 5,000 elements contains a user-entered word. The word gets entered character by character and combined into a string(guessString). And then I use .Contains() to see if that word is in an array.

***EDIT please see screenshots for debug logs WordArray Elements -- Debug Output -- Debug With whitespace detection -- Code that doesnt work

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Linq;


public class WordAction : MonoBehaviour
{
    TMP_Text m_textComponent;
    TMP_Text m_currentSquare;
    public TMP_Text[] squareArray;

    List<string> dupKey = new List<string>();

    public string[] WordArray;
    public List<string> DictionaryList = new List<string>();
    public TextAsset file;

    [SerializeField]
    Color correctColor, wrongColor, maybeColor;

    [SerializeField]
    float colorFadeSpeed, colorFadeTime; // 2f, 1f

    public float waitTime;
    public string levelID;
    public string key;
    public AudioSource revealSFX;

    bool guess;
    string guessString;
    int guessRegulator;
    int guessCount = 1;
    int lessGuessCount; // Starts variable at value of first current row element
    int maxGuessCount;

    string[] guessStringArray = new string[1];

    void Start()
    {

        for (int i = 0; i < 5; i  ) // Duplicate key
        {
            dupKey.Add(key[i].ToString());
        }

        var content = file.text;
        string[] AllWords = content.Split('\n');
        WordArray = AllWords;
    }


    public void Magic()
    {
        StartCoroutine(CompareKey());
    }

    IEnumerator CompareKey()
    {
        guessRegulator  ;
        GuessRegulatorFunction();

        lessGuessCount = (guessCount * 5) - 5; // Starts variable at value of first current row element
        maxGuessCount = guessCount * 5;
        guessCount  ; // Moves to next row
        int k = 0; // Indexer for key[]
        int cW = 0; // Indexer for CombineWord()
        GameObject keyGO; // Keyboard GO


        for (int i = lessGuessCount; i < maxGuessCount; i  )
        {
            if (cW < 1)
            {
                CombineWord(i);

                cW  ;
            }

            bool match = WordArray.Contains(guessString); // not working
            Debug.Log(match);
            if (match)
            {
                //do stuff
            }

            //compare stuff
            string guessStr = squareArray[i].text.ToString();
            string keyStr = key[k].ToString();
            bool result = guessStr == keyStr;

            if (!result && !dupKey.Contains(guessStr))
            {
                //wrong stuff
                GameObject parentGO = squareArray[i].transform.parent.gameObject; // Gets parent of SquareArray element
                Image parentImage = parentGO.GetComponent<Image>(); // Gets Image component of parent game object         
                keyGO = GameObject.Find(squareArray[i].text); // Keyboard
                Image keyParentImage = keyGO.GetComponent<Image>(); // Keyboard

                wrongColor.a = 255;
                keyParentImage.color = wrongColor;
                parentImage.color = wrongColor;
                yield return null;
            }

            if (result)
            {
                //correct stuff
                dupKey[k] = "";

                GameObject parentGO = squareArray[i].transform.parent.gameObject; // Gets parent of SquareArray element
                Image parentImage = parentGO.GetComponent<Image>(); // Gets Image component of parent game object         
                keyGO = GameObject.Find(squareArray[i].text); // Keyboard
                Image keyParentImage = keyGO.GetComponent<Image>(); // Keyboard

                correctColor.a = 255;
                keyParentImage.color = correctColor;
                parentImage.color = correctColor;
                yield return null;
            }

            if (!result && dupKey.Contains(guessStr))
            {
                //yellow stuff
                for (int x = 0; x < 5; x  ) // Duplicate key
                {
                    if (guessStr == dupKey[x])
                    {
                        dupKey[x] = "";
                    }
                }

                GameObject parentGO = squareArray[i].transform.parent.gameObject; // Gets parent of SquareArray element
                Image parentImage = parentGO.GetComponent<Image>(); // Gets Image component of parent game object         
                keyGO = GameObject.Find(squareArray[i].text); // Keyboard
                Image keyParentImage = keyGO.GetComponent<Image>(); // Keyboard

                maybeColor.a = 255;
                keyParentImage.color = maybeColor;
                parentImage.color = maybeColor;
                yield return null;
            }

            revealSFX.Play();
            k  ;
            yield return new WaitForSeconds(waitTime);
        }

        dupKey.Clear();
        for (int i = 0; i < 5; i  ) // Duplicate key
        {
            dupKey.Add(key[i].ToString());
        }

    }

    void GuessRegulatorFunction()
    {
        guessRegulator  ; // Stops multiple guess attempts

        for (int i = 0; i < (guessCount * 5); i  ) // Checks if row is blank when guessing
        {
            if (squareArray[i].text == "")
            {
                guess = false;
                guessRegulator = 0; // Resets guess regulator
                break;
            }
            else
            {
                guess = true;

            }
        }

        if (guessRegulator > 1 || guess == false) // Stops multiple guess attempts
        {
            return;
        }
    }

    public void BackSpace()
    {
        for (int i = guessCount * 5; i > (guessCount * 5) - 6; i--)
        {
            if (squareArray[i].text != "")
            {
                squareArray[i].text = "";
                break;
            }
        }
    }

    public void InputLetter()
    {
        guessRegulator = 0;

        for (int i = 0; i < guessCount * 5; i  )
        {
            if (squareArray[i].text == "")
            {
                squareArray[i].text = EventSystem.current.currentSelectedGameObject.name.ToString();
                break;
            }
        }
    }

    void CombineWord(int i)
    {
        var string1 = squareArray[i].text.ToString();
        var string2 = squareArray[i   1].text.ToString();
        var string3 = squareArray[i   2].text.ToString();
        var string4 = squareArray[i   3].text.ToString();
        var string5 = squareArray[i   4].text.ToString();

        guessString = string1   string2   string3   string4   string5;
        //Debug.Log(guessString);
    }
}

CodePudding user response:

I've taken your line of code that isn't working and copied it verbatim. I've then taken the data that you say is in the WordArray and guessString variables and set those up. Then I ran this:

var WordArray = new [] { "WHICH", "THERE", "THEIR", "ABOUT" };
var guessString= "THERE";
bool match = WordArray.Contains(guessString);
Console.WriteLine(match);

match comes out True.

Your variables do not contain the data you think they do.

It's likely that the content that you call .Split('\n') on actually contains Windows end of line markers, so a combination of "\r\n". Since you only split on '\n' it's likely that the '\r' remains in your strings and hence "THERE" does not match "THERE\r".

Try this instead:

.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

If your code is run on either Windows or on Linux the above line works. Just watch out for files that mix the endings.

CodePudding user response:

Well, your WordArray is always empty. You put your file content into a local variable called AllWords.

Your word will never be found in an empty array.

  • Related