while循环只通过一个包含4个元素的数组迭代两次

时间:2015-05-19 05:16:11

标签: c# file logic

        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循环只读取文件中的前2个值然后停止。

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

我不知道为什么会这样。我确定该数组有4个元素,因为我在索引处手动显示了值(例如content [2])。所以它正确地从文件中读取。

只要我尝试访问它停止的第三个值。

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

2 个答案:

答案 0 :(得分:4)

MSDN说

  

返回值
  类型:System.String
  输入流的下一行,如果到达输入流的末尾,则为null。

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

你拥有的是

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

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

while (contents != null)

答案 1 :(得分:0)

您可能在行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);
}