gpt4 book ai didi

c# - 预期的方法名称 - 使用 lambda 表达式错误?

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:24 25 4
gpt4 key购买 nike

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

public class aCollection:IEnumerable<T>
{
T[] items;
public int Count{ get; private set;}
//...
public bool Contains(T item)
{
EqualityComparer<T> defaultComparer = EqualityComparer<T>.Default;
for (int i = 0; i < Count; i++)
if (defaultComparer.Equals(items[i], item))
return true;
return false;
}
}

但是,在使用此解决方案时,我尝试了另一种解决方法,但我无法理解构建失败并出现 Method name expected 错误的确切原因:

public class aCollection:IEnumerable<T>
{
T[] items;
public int Count{ get; private set;}
//...
public bool Contains(T item)
{
for (int i = 0; i < Count; i++)
if ((x => x == item)(items[i])) //Method name expected
return true;
return false;
}
}

我在使用 lambda 时误解了什么?是因为某种原因我不能使用它们还是我只是写错了表达式?

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

提前致谢

hlfrmn

最佳答案

Lambda 表达式应转换为要使用的委托(delegate)。下面的代码看起来很奇怪,但是用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;
}

为避免在每次迭代时都创建一个新委托(delegate),可以在循环之前存储它:

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;
}

但是它还有一个重要的问题:运算符==没有为泛型类型(如 C++)定义。我建议使用 EqualityComparer<T>.Default比较值。

关于c# - 预期的方法名称 - 使用 lambda 表达式错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32803193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com