LINQ字符串包含另一个字符串(大小写不敏感)

6

我正在开发一个C# Windows 8 Metro应用程序,尝试使用LINQ过滤包含某个字符串的ObservableCollection<T>属性,并且需要忽略大小写。

 var searchResults = from _rest in App.ViewModel.Restaurants
                     where  _rest.Name.IndexOf(queryText,
                                 StringComparison.CurrentCultureIgnoreCase) >= 0
                     select _rest;

我遇到了一个与大小写无关的问题,以下是几种方法:

  • 在两个字符串中使用string1.Contains(string2).ToUpper()
  • 在两个字符串中使用string1.Contains(string2).ToLower()
  • 使用string1.IndexOf(string2, StringComparison.CurrentCultureIgnoreCase) >= 0
  • 使用string1.IndexOf(string2, StringComparison.OrdinalIgnoreCase) >= 0
  • 使用String.Compare(string1, string2, StringComparison.CurrentCultureIgnoreCase)

但是,这些方法在大小写不敏感时都不起作用,如果我正确地输入名称,则可以正常工作。

在Windows 8中是否有人遇到过同样的问题?

谢谢您提供的任何帮助。


5
你能否给出一个简短但完整的例子来展示这个问题? - Jon Skeet
1
它们不是欧洲大陆餐厅的名字,是吗?;-) - dash
1
如果您在.NET 4(.0) WPF应用程序中应用相同的LINQ表达式,它是否按照您所期望的方式工作? - Anders Gustafsson
制作了一个简单的.NET 4.5 Metro应用程序(VS 2011 Beta,En-US文化),并应用了您的LINQ表达式。正常工作。您使用哪种文化? - Anders Gustafsson
你能给我们一些例子吗? - Lukasz Madon
显示剩余2条评论
2个回答

1

编写自己的扩展方法

public static class MetroHelper
{
    public static bool ContainsInvariant(this string mainText, string queryText)
    {
        return mainText.ToUpperInvariant().Contains(queryText.ToUpperInvariant());
    }
}

并在您的应用程序中使用

var searchResults = from _rest in App.ViewModel.Restaurants
                 where  _rest.Name.ContainsInvariant(queryText)
                 select _rest;

那就是我所做的。


0
试试这个:
var searchResults = from _rest in App.ViewModel.Restaurants
                         where  _rest.Name.IndexOf(queryText,
                                     StringComparison.InvariantCultureIgnoreCase) >= 0
                         select _rest;

在 Metro 应用程序中不支持 StringComparison.InvariantCultureIgnoreCase。 - Rotten

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