C# 应为方法名称-使用lambda表达式错误?

C# 应为方法名称-使用lambda表达式错误?,c#,lambda,C#,Lambda,我正在自定义集合中实现一个Contains(T item)方法。 以下工作(因为它基本上是Microsoft实现的副本): 我对lambdas的用法有什么误解?是因为某种原因我不能使用它们,还是我只是写错了 EDIT:我希望函数做的是检查我的集合,看看它是否包含参数。for循环中的行应该将T[]items中的现有元素逐一与传递的T item进行比较,直到找到匹配项并返回true。或者,如果在整个数组中找不到匹配项,只需返回false 提前感谢, hlfrmn而不是像这样使用它: for (int

我正在自定义集合中实现一个
Contains(T item)
方法。 以下工作(因为它基本上是Microsoft实现的副本):

我对lambdas的用法有什么误解?是因为某种原因我不能使用它们,还是我只是写错了

EDIT:我希望函数做的是检查我的集合,看看它是否包含参数。for循环中的行应该将
T[]items
中的现有元素逐一与传递的
T item
进行比较,直到找到匹配项并返回
true
。或者,如果在整个数组中找不到匹配项,只需返回
false

提前感谢,


hlfrmn

而不是像这样使用它:

for (int i = 0; i < Count; i++)
    if ((x => x == item)(items[i]))
        return true;
if (items.Any(x => x == item))
    return true;
Expression<Func<T,bool>> lambda_expression = (x => x == item);

Func<T, bool> function = lambda_expression.Compile();

for (int i = 0; i < Count; i++)
{
    if (function(items[i]))
        return true;
}
如果出于某种原因需要使用lambda表达式作为函数(这似乎是您正在尝试的),那么您可以这样做:

for (int i = 0; i < Count; i++)
    if ((x => x == item)(items[i]))
        return true;
if (items.Any(x => x == item))
    return true;
Expression<Func<T,bool>> lambda_expression = (x => x == item);

Func<T, bool> function = lambda_expression.Compile();

for (int i = 0; i < Count; i++)
{
    if (function(items[i]))
        return true;
}
Expression lambda_Expression=(x=>x==item);
Func function=lambda_expression.Compile();
for(int i=0;i
Lambda表达式应转换为要使用的委托。以下代码看起来很奇怪,但lambda不会出现编译错误:

public bool Contains(T item)
{
    for (int i = 0; i < Count; i++)
        if (((Func<T, bool>)((T x) => x == item))(items[i]))
            return true;
    return false;
}
public bool包含(T项)
{
for(int i=0;ix==item))(items[i]))
返回true;
返回false;
}
为了避免在每次迭代时创建新委托,可以在循环之前存储该委托:

public bool Contains(T item)
{
    Func<T, bool> comparer = (T x) => x == item;

    for (int i = 0; i < Count; i++)
        if (comparer(items[i]))
            return true;
    return false;
}
public bool包含(T项)
{
函数比较器=(tx)=>x==项;
for(int i=0;i

但是它仍然有一个重要的问题:操作符
=
不是为泛型类型定义的(比如C++)。我建议使用
EqualityComparer.Default
来比较这些值。

如果您想使用您的方法,请将代码更改为

public bool Contains(T item)
{
    for (int i = 0; i < Count; i++)
        if (items[i].Equals(item))
            return true;
    return false;
}
注意:使用
EqualityComparer
默认值,如MSDN示例,否则您将错过类型
T
可能实现的任何
EqualityComparer
。请参阅'EquityComparer.Default'

更新

如果您看到
CLR核心库
,这就是
.Any()
的实现方式

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null) throw Error.ArgumentNull("source");
    if (predicate == null) throw Error.ArgumentNull("predicate");
    foreach (TSource element in source)
    {
        if (predicate(element)) return true;
    }
    return false;
}
public static bool Any(此IEnumerable源代码,Func谓词)
{
if(source==null)抛出错误.ArgumentNull(“source”);
if(predicate==null)抛出Error.ArgumentNull(“predicate”);
foreach(源中的TSource元素)
{
if(谓词(元素))返回true;
}
返回false;
}

因此,从实际实现中,您可以看到它正是您想要做的。您可以在本文中看到其他
Linq可枚举扩展
,并探索其他标准Linq方法的实现

实际上,更好的解决方案是而不是实现自己的
Contains()
方法


由于您的自定义集合实现了
IEnumerable
,因此这意味着您可以免费获得所有
IEnumerable
LINQ扩展方法,包括。无需推出您自己的。

我假设错误出现在
if((x=>x==item)(items[I])
行,但我不知道您实际上想在那里做什么。。。一些关于“我希望这样做……”的句子可以帮助你澄清你到底不明白什么。谢谢你,这很有帮助。在等待答案的过程中,我实际上通过使用
谓词myPred=((x)=>x==item)克服了最初的错误,这使我遇到了未定义的
==
运算符问题。Func的演员阵容看起来更有趣,因为MSDN链接在我看来很奇怪,我还没看过。至于LINQ Any,我还不太熟悉它是如何实现的,所以我或多或少地探索了可用的方法及其实现。@hlfrmn我已经更新了答案,以包含CLR中的Any()方法体。我希望更新后的答案能帮助你更好地理解它。谢谢你的更新。虽然我现在知道它的工作方式,但恐怕我不能使用它,因为数组中的某些元素超出了计数索引,所以它们被保存在内存中,而从技术上讲,由于计数检查,方法无法访问它们。任何foreach()循环都将在整个集合中迭代,并检查这些“已删除”的值。我正在考虑在每次类似删除的操作后触发TrimCapacity()函数,但这个想法还没有实现。谢谢LINQ的建议。我并不是想用一只赤裸的lambda来解决这个问题,而是想找出一个我偶然发现的错误。
Func f=Expression.Compile
和“((Func)((tx)=>x==item))(arg)`用法之间有什么区别吗?不,是一样的。第二种方法是将lambda表达式隐式转换为函数。但是,我不确定性能是否相同。你可以通过测试来验证。实际上我做了一个简单的测试,结果似乎更倾向于“更短”的版本,它大约快了4000倍。结果似乎有点奇怪,所以我不相信自己的话。