为什么字符串IndexOf()方法不区分大小写?

5
我很困惑这个问题。我正在学习LINQ,并使用Microsoft Visual C# Express Edition连接到一个包含有关我的书籍信息的SQL Server数据库。我根据需要创建了LINQ to SQL类。显然那些都有效。除了一个问题,如果我搜索大写字母“SR”,它会找到两条记录,“SR-71 Revealed, The Inside Story”,如预期,但它还会找到“Faded Sun: Kesrith”,其中“sr”是小写。我正在使用字符串类的IndexOf()方法,该方法应执行区分大小写的比较,对吗?输出显示第二本书的标题如上所示,其中“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);
            }
        }
    }
}

4
SQL Server 默认情况下不区分大小写。 - Marc
2个回答

10
在最后一步,您的查询将被翻译成SQL。在SQL服务器中,类似字符串的字段(varchar,nvarchar)不区分大小写。因此,select * from tbl where col like '%foo%' 将检索出如果值为FooFOo

1
啊,LINQ to SQL,你真是太疯狂了。 - BoltClock
好的...谢谢!所以为了确保,我想我必须再次使用IndexOf检查返回的标题,以确保大小写正确,然后再输出它们。 - user1013210
4
你可以将数据库的collation更改为区分大小写的类型,这样也可以达到目的。更多信息请参考http://msdn.microsoft.com/en-us/library/ms144260.aspx。 - Marc

2

我原以为它默认区分大小写,但你总是可以使用 StringComparison 重载来指定大小写敏感性:

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

StringComparison 枚举:

  1. CurrentCulture:使用当前区域设置比较字符串,不区分大小写。
  2. CurrentCultureIgnoreCase:使用当前区域设置比较字符串,区分大小写。
  3. InvariantCulture:使用固定区域设置比较字符串,不区分大小写。
  4. InvariantCultureIgnoreCase:使用固定区域设置比较字符串,区分大小写。
  5. Ordinal:基于字符编码点比较字符串,区分大小写。
  6. OrdinalIgnoreCase:基于字符编码点比较字符串,不区分大小写。

1
我不相信L2S支持这个。 - Marc
你可以使用 IndexOf,但不能使用重载?你能解释一下吗? - James Johnson
如果我更聪明或者在L2S团队中,我就可以做到。我必须尝试一下以确保L2S提供程序会反对它,而它确实会抛出NotSupportedException异常。 - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接