C# Array.Exist()仅识别数组的最后一个元素

C# Array.Exist()仅识别数组的最后一个元素,c#,arrays,C#,Arrays,如果这是一个显而易见的答案,我很抱歉,但我在StackOverflow和Google上都找不到与此行为相关的任何信息。我在自学c#,正在编写一个使用用户名/密码对的程序。在本例中,我使用.Exist()确定用户名是否已在我的用户名数组中 static bool LookUpS(string targ, string[] arr) { if (Array.Exists(arr, e => e == targ)) { re

如果这是一个显而易见的答案,我很抱歉,但我在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到数组的转换工作正常

现在谈谈实际问题。我已经用几个值填充了有问题的文本文档:“木星”、“海王星”、“土星”、“火星”。如果我将前三项中的任何一项传递到
查找
,它将返回
false
,尽管它们确实存在。然而,我不明白的是,如果我将“Mars”(或最后一个值碰巧是什么)传递到函数中,它会像应该的那样返回
true
。如果我要删除“Mars”值,
LookUpS
会说“Saturn”是
true
而不是其他值。有人能解释一下吗?如果这有助于识别问题,我可以发布程序的更完整的图片。

阵列有一个可以完全满足您需要的功能

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()

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


不需要使用
if。。否则
返回
true
false
,即Any()、Exists()和Contains()返回的方法都是bool,因此您只需返回方法调用,如您提到的注释中的示例所示,您使用\n作为拆分分隔符拆分了行。但在Windows上使用了\r\n。因此,分割字符串数组将包含

  • xxxx\r\n
  • yyyy\r\n
  • 最后用户
最后一行不包含可以使用的换行符


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

是否在
Exists
委托中放置了断点以调试数组中迭代的每个值?如何将.txt文件转换为数组?可能是
arr
中的字符串包含换行符,最后一个除外。我要说的是,字符串的拆分有问题。尝试打印
string.Join(“|”,arr)
并查看
|
周围是否有空格。我将txt文件读入字符串,然后使用.split(新字符[]{'\n})拆分字符串;似乎“\n”可以解释为什么会发生这种情况,但我的印象是分割字符不会包含在数组中。@AlexClough分割字符不会包含在数组中,但是如果文件被
\r\n
对分割,则
\r
将保留。尝试改用
ReadAllLines
。这并不能解释现有代码不起作用的原因-虽然
Contains
更简单,但如果可以的话,我希望原始代码可以起作用。我现在尝试使用Contains,但仍然不起作用。可能是因为Glorfindel对的是正确的。在这种情况下,这里的问题似乎是您的输入数据,而不是您用来测试它的方法。这里要做的最好的事情是迭代数组的内容(或调试它),并找出实际值是什么。光标从未改变行,我认为这意味着元素中没有换行符。在
System.Array
中没有方法
Contains
。您可以调用显式接口实现,如在
((ICollection)array).Contains(“Neptune”)
中,或者使用具有扩展名的Linq。后者可能会走捷径,并在可能的情况下调用前者(例如,对于哈希表和排序字典来说,这可能是一个优势)。我不明白您当前的代码为什么不能工作,但这可能会对您有所帮助。谢谢!我应该意识到这一点,因为当我迭代数组时,回车符返回,但行没有改变。我认为这是.Write()的副产品。我也采纳了Malte R的建议,一切都很顺利。他可以使用不同的重载,在
new[]{Environment.NewLine}
上拆分,而不是像你建议的那样在
Environment.NewLine()上拆分。
static bool LookUpS(string targ, string[] arr)
        {
            return (arr.Contains(targ);
        }