【问题标题】:why is string IndexOf() acting case-INsensitive?为什么字符串 IndexOf() 不区分大小写?
【发布时间】:2011-10-25 17:48:35
【问题描述】:

我真的被这个难住了。我正在学习 LINQ 并使用 Microsoft Visual C# Express Edition 连接到包含有关我的书籍信息的 SQL Server 数据库。我根据需要创建了 LINQ to SQL 类。那东西显然有效。这一切都有效,除了我无法弄清楚为什么,如果我搜索“SR”(大写),它会发现两条记录,“SR-71 Revealed, The Inside Story”,正如预期的那样,但它也发现“褪色的太阳: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);
            }
        }
    }
}

【问题讨论】:

  • SQL Server 默认不区分大小写。

标签: c# string linq linq-to-sql indexof


【解决方案1】:

在最后一步,您的查询被翻译成 sql。在 SQL Server 中,类似字符串的字段(varchar、nvarchar)不区分大小写。所以 如果值为FooFOoselect * from tbl where col like '%foo%' 将检索

【讨论】:

  • 啊,LINQ to SQL,你太疯狂了。
  • 好的...谢谢!所以为了确保,我想我必须用 IndexOf AGAIN 重新检查返回的标题,以确保在输出它们之前大小写正确。
  • @user1013210 或者您将数据库的collation 更改为区分大小写的类型。 msdn.microsoft.com/en-us/library/ms144260.aspx
【解决方案2】:

我认为默认情况下它是区分大小写的,但您始终可以使用 StringComparison 重载来指定区分大小写:

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

StringComparison枚举:

  1. 当前文化
  2. CurrentCultureIgnoreCase
  3. 不变文化
  4. InvariantCultureIgnoreCase
  5. 序数
  6. OrdinalIgnoreCase

【讨论】:

  • 我认为 L2S 不支持此功能。
  • 你可以使用IndexOf,但不能超载?你能解释一下吗?
  • 如果我更聪明或者在 L2S 团队中,我可以。我不得不尝试一下,以确保 L2S 提供商拒绝它,而且确实如此。 NotSupportedException.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2016-01-26
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多