什么';我的Lambda表达式错了
本文关键字:Lambda 表达式 错了 我的 什么 | 更新日期: 2023-09-27 18:25:31
我正在尝试用C#编写一个简单的Lambda表达式:
int numElements = 3;
string[]firstnames = {"Dave", "Jim", "Rob"};
string[]lastnames = {"Davidson", "Jameson", "Robertson"};
List<Person> people = new List<Person>();
for(int i = 0 ; i < numElements; i++)
{
people.Add(new Person { FirstName = firstnames[i], LastName = lastnames[i] });
}
bool test = people.Contains(p => p.FirstName == "Bob");
我对Lambda表达式及其工作方式的理解仍然有点模糊,我很生气为什么这不起作用。。。我想知道列表中是否包含一个名字。。。
您正在寻找:
bool test = people.Any(p => p.FirstName == "Bob");
还是你把Rob和Bob混在一起?
这里的问题不是lambdas,而是for
循环的边界。您定义的数组的长度为3,但numElements
的值被定义为10
。这意味着您将在循环的第4次迭代中获得非法数组索引的异常。尝试以下
int numElements = 3;
或者更简单地删除numElements
变量,转而迭代到firstnames
数组的长度
for (int i = 0; i < firstnames.length; i++) {
...
}
编辑
OP表示,最初发布的numElements
是一个拼写错误。代码中其他可能的错误来源
- 如果要查找匹配的元素,请使用
"Rob"
而不是"Bob"
GenericList<T>
上的Contains
方法需要具有兼容的委托签名。例如Func<T, bool>
-
确保您正在链接System.Linq名称空间,即
using System.Linq;
-
您正在使用Contains方法。此方法需要一个Person,并将使用相等比较来确定您的集合是否已包含它。在默认情况下,相等比较默认为引用比较,因此它永远不会包含它,但这是另一个主题。
-
要实现目标,请使用Any方法。这将告诉您集合中是否有任何元素符合条件。
people.Any(p => p.FirstName == "BoB");
您可能想了解扩展方法First、FirstOrDefault和Where,因为它们也可以解决您的问题。
您没有将numElements
设置为正确的值(您将其设置为10,但您的数组只有3个值)-此外,您甚至不需要它,只需使用集合初始值设定项而不是那些单独的字符串数组:
GenericList<Person> people = new GenericList<Person>()
{
new Person { FirstName = "Dave", LastName = "Davidson" },
new Person { FirstName = "Jim", LastName = "Jameson" }
new Person { FirstName = "Rob", LastName = "Robertson" }
}
现在假设您的GenericList<T>
类实现了IEnumerable<T>
,您可以使用Any()
来进行测试:
bool test = people.Any(p => p.FirstName == "Bob");
这个lambdas的真正问题是什么?
如果因为你的测试是假的,那么在firstName 中没有"Bob"是真的
bool test = people.Contains(p => p.FirstName == "Bob");
和
string[]firstnames = {"Dave", "Jim", "Rob"};
这里有几个问题。
一:GenericList
不是类型。您可能正在查找泛型类型System.Collections.Generic.List<T>
。
第二:Contains
在您的示例中接受Person
,而不是委托(lambdas是从C#开始编写委托的一种新方法)。在这里获得所需内容的一种方法是将Where
和Count
以bool test = people.Where(p => p.FirstName == "Bob").Count() > 0;
的形式组合起来
// We will use these things:
Predicate<Person> yourPredicate = p => p.FirstName == "Bob";
Func<Person, bool> yourPredicateFunction = p => p.FirstName == "Bob";
Person specificPerson = people[0];
// Checking existence of someone:
bool test = people.Contains(specificPerson);
bool anyBobExistsHere = people.Exists(yourPredicate);
// Accessing to a person/people:
IEnumerable<Person> allBobs = people.Where(yourPredicateFunction);
Person firstBob = people.Find(yourPredicate);
Person lastBob = people.FindLast(yourPredicate);
// Finding index of a person
int indexOfFirstBob = people.FindIndex(yourPredicate);
int indexOfLastBob = people.FindLastIndex(yourPredicate);
你应该在某个时候使用LINQ方法。。。