почему строка IndexOf () действует без учета регистра? - PullRequest
5 голосов
/ 25 октября 2011

Я действительно озадачен этим. Я изучаю LINQ и использую Microsoft Visual C # Express Edition для подключения к базе данных SQL Server, содержащей информацию о моих книгах. Я создал классы LINQ to SQL по мере необходимости. Этот материал, очевидно, работает. Все это работает, за исключением того, что я не могу понять всю жизнь, почему, если я ищу «SR» (заглавные буквы), он находит две записи, «SR-71 Revealed, The Inside Story», как и ожидалось, но также находит « Faded Sun: Kesrith ", где" sr "в нижнем регистре. Я использую метод IndexOf () класса string, который должен выполнять сравнение с учетом регистра, верно? Выходные данные отображают название второй книги, как показано выше, с "sr" в нижнем регистре. Вот соответствующая часть кода:

// normal using directives here
namespace QueryBooksDB {
    class Program {
        static void Main() {
            var urgh = new BooksDataContext();

            Console.WriteLine("Enter a string to search for:");
            string str = Console.ReadLine();

            var list = from book in urgh.Books
                        where book.Title.IndexOf(str) > -1
                        orderby book.Title
                        select new { ID = book.BookId, book.Title, book.Location };

            foreach ( var b in list ) {
                Console.WriteLine(b.Title);
            }
        }
    }
}

Ответы [ 2 ]

10 голосов
/ 25 октября 2011

На последнем этапе ваш запрос переводится в sql. В строке SQL-сервера одинаковые поля (varchar, nvarchar) не чувствительны к регистру. Так select * from tbl where col like '%foo%' будет извлечено, если значение Foo или FOo

2 голосов
/ 25 октября 2011

Я думал, что он чувствителен к регистру по умолчанию, но вы всегда можете использовать перегрузку StringComparison для указания чувствительности к регистру:

test.IndexOf("foo", StringComparison.Ordinal);

StringComparison перечисление:

  1. CurrentCulture
  2. CurrentCultureIgnoreCase
  3. InvariantCulture
  4. InvariantCultureIgnoreCase
  5. Порядковый
  6. OrdinalIgnoreCase
...