Почему string.contains () возвращает false? - PullRequest
1 голос
/ 29 июня 2009

У меня есть следующая строка: \\\?\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();

Ответы [ 5 ]

7 голосов
/ 29 июня 2009

Когда я вставляю ваш код в C #, компилятору не нравится часть "\ h" вашей длинной строки. Там написано «неопознанная escape-последовательность». Может ли это быть вашей проблемой?

Да, и если я поставлю "@" перед длинной строкой, метод contains () вернет true.

НТН,

1007 * Дан *

2 голосов
/ 29 июня 2009

Предполагая, что вы уже проверили на букву "O" против цифры "0" и подобных вещей, я бы предположил, что строка, которую вы видите в строковой переменной devPathName, кодируется для отображения и не является ' не совсем то, что вы думаете.

Например, если строка содержит символ \x000d (Control-M), отладчик Visual Studio отобразит его как \r при проверке значения строки.

Или, для другого примера, если строка содержит последовательность 3504 (три-пять-ноль-четыре), но вместо этого вы ищете 35O4 (три-пять-о-четыре), то вы не найдете соответствия ,

(В зависимости от вашего шрифта вы не сможете увидеть различия между некоторыми символами. Сравните «0O1lB8S5» с «0O1lB8S5» в разных шрифтах, чтобы понять, что я имею в виду.)

0 голосов
/ 29 июня 2009

Вам просто нужно экранировать длинную строку перед ее анализом через .Contains ()

Поместите символ at (@) в начале строки, как показано в нескольких предыдущих ответах, и он должен прекрасно оцениваться.

При входе в .Contains, начальная строка, в вашем случае

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

содержит не экранированные символы и вызывает. Содержит прекращение до завершения сравнения.

0 голосов
/ 29 июня 2009

Что оценивается как 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

а может, вы смотрите только на первую строку этой строки?

0 голосов
/ 29 июня 2009

Это также верно для меня.


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 не изменяется на вас и что значение соответствует ожидаемому.

...