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倍。结果似乎有点奇怪,所以我不相信自己的话。