【问题标题】:Why is string.contains() returning false?为什么 string.contains() 返回 false?
【发布时间】:2009-06-29 03:00:45
【问题描述】:

我有以下字符串:\\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030} 存储在名为 devPathName 的字符串变量(来自函数调用)中

以下定义:const string myDevice = @"vid_04d8pid_003f";

但以下代码的计算结果始终为 false:

Boolean test = true;

test = devPathName.Contains(myDevice);

statusLabel.Text += "\n\tThe value of test: " + test.ToString();

【问题讨论】:

  • 它在我的机器上返回 true。您可能希望提供有关该代码的上下文以及您的测试方式的更多信息。

标签: c# .net string


【解决方案1】:

当我将您的代码粘贴到 C# 中时,编译器不喜欢长字符串的“\h”部分。它说,“无法识别的转义序列”。会不会是你的问题?

哦,如果我在长字符串前加上“@”,contains() 方法会返回 true。

HTH,

-丹

【讨论】:

    【解决方案2】:

    假设您已经检查了字母“O”与数字“0”和类似的东西,我建议您在字符串变量devPathName 中看到的字符串正在被编码以供显示并且不是不是你想的那样。

    例如,如果字符串包含字符 \x000d (Control-M),当您检查字符串的值时,Visual Studio 调试器会将其显示为 \r

    或者,再举一个例子,如果字符串包含序列 3504(三五零四),但您改为搜索 35O4(三五哦四),那么您将找不到匹配项.

    (根据您的字体,您可能无法看到某些字符之间的差异。比较不同字体中的“0O1lB8S5”和“0O1lB8S5”以了解我的意思。)

    【讨论】:

    • Hhmmm.... 你的意思是我需要使用 UnicodeEncoding 转换它吗?我实际上是从 IntPtr (devPathName = Marshal.PtrToStringAuto(pdevPathName);) 中检索该字符串,但您能解释一下您的意思吗?谢谢
    • @dark-star1 - 更新了我的答案,澄清一下,希望更清楚。
    • 你和帕特似乎一针见血。尝试使用 Path.* 抛出异常,表明某处有 '\r' 和 '\n' 。我猜这是在返回字符串的开头。有没有办法绕过这个或者我必须复制字符串,修改然后测试它的子字符串?
    • 一个好的经验法则是始终对来自应用程序外部的输入进行完整性检查,无论是否由用户直接输入。作为第一步,您可以使用 Trim() 删除前导空格和训练空格 - 但如果这是我的代码,我会更严格。
    • 你必须原谅我的马虎。我正在同时学习 C# 和 Visual Studio 2008 Express 环境。我一直避免在 Windows 上编码是有充分理由的。无论如何,我发现字符串是这样构造的:“&”用于聚合字符串中的每条信息。虽然这个字符没有显示。就是这件小事让我失望了。
    【解决方案3】:

    这对我来说也返回 true。

    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                const string myDevice = @"vid_04d8pid_003f";
                string devPathName = @"\\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
                Boolean test =devPathName.Contains(myDevice);
                MessageBox.Show("\n\tThe value of test: " + test.ToString());
            }
        }
    }
    

    我想我会在其中设置一个断点,并确保您的 devPathName 没有被更改,并且该值是您所期望的。

    【讨论】:

    • devPathName 这样返回:devPathName = Marshal.PtrToStringAuto(pdevPathName);和 pdevPathName: pdevPathName = new IntPtr(deviceDetailDataBuffer.ToInt32() + 4);我已经尝试了以下所有方法: 1) Path.GetFullPath() => 返回和异常说有控制字符 (\r\n),但是删除前 4 个字符可以解决这个问题。 2) 删除前 8 个字符,使字符串以我需要的子字符串开头。仍然返回 false。
    • deviceDetailDataBuffer 是什么类型的?是小数吗?价值从何而来?您可以创建一个函数来仅检查字母/数字和标点符号以删除任何转义字符。请参阅 Char.IsLetterOrDigit 和 Char.IsPunctuation。
    • deviceDetailDataBuffer 是一个函数返回的 IntPtr,内置的 string.Replace() 函数显然可以去除转义字符。
    • 你可能想试试 string path_name = Marshal.PtrToStringAuto(deviceDetailDataBuffer);
    【解决方案4】:

    什么是 false,您的测试变量或 statusLabel.text 中显示的一部分?你确定显示不是这样的:

    The value of test: false
    The value of test: false
    The value of test: false
    The value of test: false
    The value of test: true
    The value of test: false
    

    也许您只查看该字符串的第一行?

    【讨论】:

      【解决方案5】:

      您只需要在通过 .Contains() 解析之前对长字符串进行转义

      在字符串的开头放置一个符号 (@),如前面的几个答案所示,它应该可以完美评估。

      当进入 .Contains 时,初始字符串,在你的情况下

      \\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
      

      包含非转义字符并导致 .Contains 在完成比较之前终止。

      【讨论】:

      • 不幸的是,我无法逃避它,因为我知道这个字符串应该是从 setupapi* 函数返回的设备的路径。您是否知道一种方法/功能可以让我过滤掉控制字符,例如 '\r' 和 '\n'?
      • 我认为在这种情况下,您唯一的选择是将其保存为局部变量,并在将其传递给 .Contains 之前执行您需要执行的任何操作,如果您传递给它的函数没有能够将其作为“安全”字符串返回。
      • 我终于想通了。当我注意到返回的描述设备的字符串在描述设备的每个部分之间有一个“&”时,我正在查看调试器。因此,虽然显示的字符串是:\\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030}。缓冲区中的实际字符串为:\\\?\hid#vid_04d8&pid_003f#6&2edf1108&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
      • 贝文选择了那个。 // 信用到期的信用。 ;-) 很高兴你找到它并且它对你有用。
      猜你喜欢
      • 2013-01-20
      • 2013-09-18
      • 2014-11-17
      • 2014-03-11
      • 2019-07-12
      • 2012-08-24
      • 2013-03-08
      • 2016-09-02
      相关资源
      最近更新 更多