"string"不包含名为"Contains"的定义。

9

我有一个类似于以下语句:

var vals =
    from StandAloneUserPayment saup in _Session.Query<StandAloneUserPayment>()
        .Fetch(x => x.RecurringPayments)
    where
        saup.User.UserId == userId
        && searchString.Contains(saup.FriendlyName, StringComparer.InvariantCultureIgnoreCase)
    select
        saup;

这似乎正是我应该做的,但使用 Contains 方法时,整行都被下划线标记,并出现以下错误提示:

string 不包含名为 Contains 的定义,最佳扩展方法重载 System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>) 具有一些无效参数。

我做错了什么?

4个回答

17

尝试使用IndexOf

searchString.IndexOf(saup.FriendlyName,
                     StringComparison.InvariantCultureIgnoreCase) != -1

之所以不起作用,是因为接受一个 IEqualityComparer<TSource>Contains 扩展方法正在操作一个 String,它实现了IEnumerable<char>而不是IEnumerable<string>,所以不能将一个string和一个 IEqualityComparer<string> 传递给它。


我的Intellisense会和您争辩。它告诉我有三个重载。 - Jeremy Holovacs
1
@JeremyHolovacs:其中一个使用StringComparer?(抱歉,我现在无法尝试,但通常MSDN是正确的...) - Ry-
1
@JeremyHolovacs 扩展方法? - Lukasz Madon
2
@JeremyHolovacs:哦,我刚意识到Contains不起作用的原因了;String.Contains是一个特例,因为stringIEnumerable<char>而不是IEnumerable<string> - Ry-
1
@Paul-SebastianManole:关于String类中名为Contains的方法的文档,该方法接受一个参数,第二个参数不是IEqualityComparer<string> - Ry-
显示剩余11条评论

3
即使有一个Contains(source, item, comparer)方法,你也不能在NHibernate中使用它,因为比较器是代码,而不是表达式树,NH无法翻译。

也就是说,除非你编写一个针对你的比较器特殊情况生成的LINQ提供程序扩展,否则不能这样做。


奇怪的是智能感知直接指出了问题。IndexOf 对我所需的功能起作用,但似乎应该可以使用其他方法。 - Jeremy Holovacs

2
你正在使用的.Contains方法来自于LINQ - 它将字符串视为一个IEnumerable<char>,因此需要一个IEqualityComparer<char>。StringComparer比较器实现了IEqualityComparer<String>。
如果minitech的IndexOf方法有效,我认为那将是最简单的方法。

-3
请在您的类中添加以下命名空间:
using System.Linq;

希望能对你有所帮助。


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