While循环只在包含4个元素的数组中迭代两次

本文关键字:迭代 两次 数组 循环 包含 元素 4个 While | 更新日期: 2023-09-27 17:49:36

        StreamReader sr = new StreamReader(path);
        String contents = "LINE";
        while (!string.IsNullOrWhiteSpace(contents)) 
        {
            contents = sr.ReadLine();
            foreach (TSPlayer plr in newPlayers.Keys) 
            {
                if (plr.Name.ToLower() == contents.ToLower() || plr.UserAccountName.ToLower() == contents.ToLower())
                {
                    TShock.Utils.ForceKick(plr, "Bad name. GO AWAY!");
                    newPlayers.Remove(plr);
                }
            }
        }
        sr.Close();      

我正在从一个文本文件中读取4行所有包含值(没有空行)。上面的while循环只从文件中读取前两个值,然后停止。

我已经尝试使用一个常规的For循环和一个Foreach循环后分割文件的内容在''n',但同样的事情发生了。

我不知道为什么会这样。我知道肯定数组有4个元素,因为我手动显示的值在索引(例如。内容[2])。因此,从文件中正确读取。

只是当我尝试访问第三个值时它就会停止

谢谢你的帮助,非常感谢。

While循环只在包含4个元素的数组中迭代两次

MSDN显示


返回值类型:系统。字符串
输入流的下一行,如果到达输入流的末尾则为空。

https://msdn.microsoft.com/en-us/library/system.io.streamreader.readline (v = vs.110) . aspx

你所拥有的是

while (!string.IsNullOrWhiteSpace(contents)) 
{
    contents = sr.ReadLine();

如果你的文件的第三行是空格,那么你的循环将退出,它应该是

while (contents != null)

很可能在while (!string.IsNullOrWhiteSpace(contents))行中存在逻辑问题。我怀疑你有空格

你的代码中也有一个逻辑问题,当你有一个null或空格时,它必须在退出之前运行一次。

你最好避免这种循环,使用LINQ编写代码。

试试这个:

var lines = new HashSet<string>(
    File
        .ReadAllLines(path)
        .Select(line => line.Trim().ToLower())
        .Where(line => !string.IsNullOrWhiteSpace(line)));
var matches =
    from plr in newPlayers
    let name = plr.Key.Name.ToLower()
    let userAccountName = plr.Key.UserAccountName.ToLower()
    where lines.Contains(name) || lines.Contains(userAccountName)
    select plr.Key;
foreach (var plr in matches.ToArray())
{
    TShock.Utils.ForceKick(plr, "Bad name. GO AWAY!");
    newPlayers.Remove(plr);
}