C# Array.Exist()仅识别数组的最后一个元素
如果这是一个显而易见的答案,我很抱歉,但我在StackOverflow和Google上都找不到与此行为相关的任何信息。我在自学c#,正在编写一个使用用户名/密码对的程序。在本例中,我使用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
.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);
}