array. exist()只识别数组的最后一个元素

本文关键字:数组 最后一个 元素 识别 exist array | 更新日期: 2023-09-27 17:49:01

如果这是一个明显的答案,我很抱歉,但我在StackOverflow和Google上找不到任何与此行为相关的内容。我自学c#,正在编写一个涉及使用用户名/密码对的程序。在本例中,我使用.Exist()来确定用户名是否已经在我的用户名数组中。

    static bool LookUpS(string targ, string[] arr)
    {
        if (Array.Exists(arr, e => e == targ))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

参数targ来自用户,参数arr被写入程序以指定应该搜索哪个数组(这样我就可以在不同的数组上使用LookUpS)。我现在测试的数组来自一个文本文档。我已经测试了,以确认从.txt到数组的转换是正常工作的。

现在讨论实际问题。我用几个值填充了文本文档:"木星"、"海王星"、"土星"、"火星"。如果我将前三个中的任何一个传递给LookUpS,它将返回false,尽管它们确实存在。然而,我不明白的部分是,如果我将"Mars"(或任何最后一个值)传递到函数中,它会像它应该的那样返回true。如果我要删除"火星"值,LookUpS会说"土星"是true,而不是其他的。有人能解释一下吗?如果能帮助你找出问题所在,我可以把程序的更完整的图片贴出来。

array. exist()只识别数组的最后一个元素

在评论中,您提到使用'n作为分隔符分隔行。但是在Windows上使用'r'n。因此分割字符串数组将包含

  • xxxx ' r
  • yyyy ' r
  • lastUser

最后一行不包含换行符

这解释了为什么在数组中搜索只能找到数组中的最后一个用户。传递给拆分操作不是'r,而是Environment.NewLine.ToCharArray()来删除字符串数组中的所有换行字符。

数组有一个叫做contains()的内置方法,它应该做你想做的事情…

string[] array = { "Jupiter", "Neptune", "Saturn", "Mars" };
if (array.Contains("Neptune")) {
    return true;
}

您可以将其简化为这样的内容。如果您愿意,可以使用Exists()代替Any()。

static bool LookUpS(string targ, string[] arr)
    {
        return (arr.Any(s => s == targ))
    }

或者如果您希望它不区分大小写:

static bool LookUpS(string targ, string[] arr)
    {
        return (arr.Any(e => String.Equals(e, targ, StringComparison.CurrentCultureIgnoreCase));
    }

或者,正如Karl建议的,您可以使用Contains()

static bool LookUpS(string targ, string[] arr)
        {
            return (arr.Contains(targ);
        }

有时简化代码可以解决一些问题:)

您不需要使用if .. else来返回truefalse的原因是Any(), Exists()和Contains()返回的方法是bool,因此您可以只返回方法调用,如示例

所示