why is string IndexOf() acting case-INsensitive?
Asked Answered
U

2

5

I'm really stumped by this one. I'm learning LINQ and used Microsoft Visual C# Express Edition to connect to a SQL Server database containing information about my books. I created the LINQ to SQL classes as needed. That stuff obviously works. It all works except I cannot figure out for the life of me why, if I search for "SR" (uppercase), it finds two records, "SR-71 Revealed, The Inside Story", as expected, but it also finds "Faded Sun: Kesrith" where the "sr" is lowercase. I'm using the IndexOf() method of the string class, which is supposed to perform a case-SENSITIVE comparison, right? The output displays the second book title as shown above, with the "sr" in lowercase. Here's the pertinent part of the code:

// 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);
            }
        }
    }
}
Unpaged answered 25/10, 2011 at 17:48 Comment(1)
SQL Server is not case sensitive by default.Caravaggio
B
10

At the final step your query is translated into sql. In SQL server string alike fields (varchar, nvarchar) are case insensetive. So select * from tbl where col like '%foo%' will retrieve if the value is Foo or FOo

Banquer answered 25/10, 2011 at 17:52 Comment(3)
Ahh, LINQ to SQL, you so crazy.Cannikin
Ok...thanks! So to make sure, I guess I have to re-check the returned titles with IndexOf AGAIN to make sure the case is correct before I output them.Unpaged
@Unpaged or you change the collation for your database to a case-sensitive type. msdn.microsoft.com/en-us/library/ms144260.aspxCaravaggio
S
2

I thought it was case-sensitive by default, but you can always use the StringComparison overload to specify case sensitivity:

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

StringComparison enumeration:

  1. CurrentCulture
  2. CurrentCultureIgnoreCase
  3. InvariantCulture
  4. InvariantCultureIgnoreCase
  5. Ordinal
  6. OrdinalIgnoreCase
Scutter answered 25/10, 2011 at 17:55 Comment(3)
I don't believe this is supported in L2S.Caravaggio
You can use IndexOf, but not the overload? Can you explain that?Scutter
If I were smarter or on the L2S team, I could. I had to just try it to make sure the L2S provider balked at it, and it does. NotSupportedException.Caravaggio

© 2022 - 2024 — McMap. All rights reserved.