我有以下字符串:\\\?\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();
答案 0 :(得分:7)
当我将代码粘贴到C#中时,编译器不喜欢长字符串中的“\ h”部分。它说,“无法识别的逃脱序列”。这可能是你的问题吗?
哦,如果我在长字符串之前加上“@”,则contains()方法返回true。
HTH,
-Dan
答案 1 :(得分:2)
假设您已经检查过字母“O”与数字“0”以及类似的东西,我建议您在字符串变量devPathName
中看到的字符串正在编码以供显示和并不是你认为的那样。
例如,如果字符串包含字符\x000d
(Control-M
),则在检查字符串的值时,Visual Studio调试器将显示为\r
。
或者,另一个例子,如果字符串包含序列3504(三 - 五 - 四 - 四)但您搜索35O4
(三 - 五 - 四 - 四),那么你将找不到一场比赛。
(根据您的字体,您可能无法看到某些字符之间的差异。将“0O1lB8S5”与“0O1lB8S5
”用不同的字体进行比较,看看我的意思。)
答案 2 :(得分:0)
这对我来说也是如此。
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没有被更改,并且该值是您所期望的。
答案 3 :(得分:0)
在statusLabel.text中评估为false,测试变量或部分显示的内容是什么?你确定显示器不是这样的:
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
也许你只是在看那个字符串的第一行?
答案 4 :(得分:0)
你需要在通过.Contains()
解析它之前转义长字符串在字符串的开头添加一个符号(@),如前几个答案所示,它应该完美评估。
当踩到.Contains时,初始字符串,在你的情况下
\\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
包含非转义字符和原因.Contains在完成比较之前终止。