【问题标题】:Method call to bool values not working对布尔值的方法调用不起作用
【发布时间】:2015-07-31 02:04:41
【问题描述】:

我有一段工作代码,当它在读入的文本文件中遇到错误时,它会为该文本着色以突出显示它,因为它被写回新文件。

    if (item.LogEntry.ToUpper().Contains("Error=\"Device Not Found\"".ToUpper()))
    {
       //Write out to new file in red to highlight error
    }
    else
    {
      //Write out to new file as normal
    }

我正在尝试在一个名为 GetCriticalErrors() 的方法中编写所有这些内容。我正在使用布尔值在发现错误时返回真或假。这是我目前所拥有的。

    bool aCriticalError;
    public bool GetCriticalErrors(string logEntry)
    {
        foreach (var item in logEntry.ToUpper())
        {
            if (item.ToString().Contains("Error=\"Device Not Found\"".ToUpper()))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        return aCriticalError;
    }

我这样调用方法

    if (GetCriticalErrors(item.LogEntry) == true)
    {
       //Write out to new file in red to highlight error
    }
    else
    {
        //Write out to new file as normal
    }

问题是这种使用方法的方式行不通。我不确定为什么?它不会抛出任何错误。它只是没有为新写入的文件中的错误文本着色。原始代码有效,但我需要将它放入一个方法中,传入 item.LogEntry。谁能看到我哪里出错了?

另外,为了回答所指出的问题,我将在许多字符串上搜索许多不同的错误消息。不只是这一个错误,它可能会出现很多次。

【问题讨论】:

  • 投反对票的人可以解释投反对票的原因吗?如果问题有问题,请告诉我。

标签: c# methods boolean


【解决方案1】:

这是你的问题:-

foreach (var item in logEntry.ToUpper())

logEntrystring 不是字符串的集合!您正在逐个字符地迭代字符串,因此 item 的类型为 char 并且 item.ToString().Contains("Error=\"Device Not Found\"".ToUpper()) 永远不会为真。

如果您只检查一个字符串,请使用:-

private readonly string errorString = "Error=\"Device Not Found\"".ToUpper();

public bool GetCriticalErrors(string logEntry)
{
  return logEntry.ToUpper().Contains(errorString);
}

如果您要检查多个字符串:-

public bool GetCriticalErrors(IEnumerable<string> logEntries)
{
  return logEntries.Any(x => x.ToUpper().Contains(errorString));
}

如果您要检查一个字符串是否有多个错误:-

private IEnumerable<string> errorStrings = new[]
{
  "Error=\"Device Not Found\"".ToUpper(),
  ...
};

public bool GetCriticalErrors(string logEntry)
{
  var logEntryUpper = logEntry.ToUpper();
  return errorStrings.Any(x => logEntry.Contains(x));
}

顺便说一句,.ToUpper() 并不是进行不区分大小写比较的好方法。您可能需要考虑以下方面的内容:-

return logEntry.IndexOf("Error=\"Device Not Found\"",
                        StringComparison.OrdinalIgnoreCase) != -1;

【讨论】:

  • 嗨。谢谢@Iain,但我会搜索很多字符串。
  • 然后您需要将字符串集合传递给您的方法,或者从 foreach 内部调用您的方法!
  • 另外,不要使用 ToUpper 进行比较 - 只需使用 logEntry.Contains(searchString, StringComparer.InvariantCultureIgnoreCase)
  • @Luaan:遗憾的是string.Contains 没有采用StringComparer 的重载。不知道为什么。您必须改用string.IndexOf(或者可能是culture.CompareInfo 中的众多实用方法之一)
【解决方案2】:

logEntry 是一个字符串,因此无需使用for-each,您还需要在输入字符串和要检查的字符串上使用.ToUpper()

public bool GetCriticalErrors(string logEntry)
{       
    return logEntry.ToUpper().Contains("Error=\"Device Not Found\"".ToUpper());
}

//If you want to check in list of string
public bool GetCriticalErrors(List<string> logEntries)
{       
    var errorStr = "Error=\"Device Not Found\"".ToUpper();
    return logEntries.Any(l => l.ToUpper().Contains(errorStr));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 2013-07-22
    • 1970-01-01
    • 2013-08-12
    • 2013-07-03
    • 2017-07-02
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多