这是我在Unity3D教程中找到的C#方法:
Public List<Piece> pieces = new List<piece>(); // list of pieces in the pool
public Piece GetPiece(PieceType pt, int visualIndex) {
Piece p = pieces.Find(x => x.type == pt && x.visualIndex == visualIndex);
}
我不明白的是这一行:
x => x.type == pt...
“x”从哪里来以及为什么是 x.type?
List<T>.Find
,与GameObject.Find
无关!
List<T>.Find
:
搜索与指定谓词定义的条件相匹配的元素,并返回整个
中的第一个匹配项。List<T>
是一个方法的委托[(或者在您的情况下是 lambda 表达式)],如果传递给它的对象与委托中定义的条件匹配,则返回Predicate<T>
。当前true
的元素被单独传递给List<T>
委托,在Predicate<T>
中向前移动,从第一个元素开始,到最后一个元素结束。找到匹配项后,处理就会停止。List<T>
然后你有一个 Lambda 表达式,其中
x
是迭代器变量,如
foreach(var x in pieces)
这就是
x
的来源。基本上你喜欢叫什么就可以叫什么。它的类型是 Piece
,所以这取决于你的 Piece
实现,x.type
是什么.. 看看你的参数,我会说它是一个 enum
,称为 PieceType
。
所以它的作用基本相同,只是
的简写public Piece GetPiece(PieceType pt, int visualIndex)
{
foreach(var x in pieces)
{
if(x.type == pt && x.visualIndex == visualIndex) return x;
}
return default;
}
如果您查看
Find
定义 public T Find (Predicate<T> match)
,您会发现它接收 Predicate<T>
,它只不过是一个带有参数 T
和返回值 bool
、Func<T, bool>
的函数。这实际上意味着将根据提供的函数过滤元素的序列。
指定
Func<T, bool>
的一种可能方法是使用称为 lambda 表达式的 C# 语言构造。也就是说 x => x.type == pt...
是一个 lambda 表达式,它定义了要搜索的元素的条件。
看着:
Piece p = Pieces.Find(x => x.type == pt && x.visualIndex == visualIndex)
目的是根据
Pieces
和 type
过滤 visualIndex
,其中 x
是 Piece
。不要与 x
混淆,您可以使用任何文字。你可以这样读:
给我每个 Piece x,其中 x.type 是 pt,x.visualIndex 是 VisualIndex
x
是在 Piece
列表中找到的 Pieces
对象,而 x.type
是 Piece 类中定义的字段,这反过来又让您拥有具有相同 p
的
PieceType
对象作为
pt
在
find
方法中,您声明一个 lambda 函数(更准确地说是一个 谓词),并且 x
是该函数的变量。根据此指令,x
是Piece
类的实例,它具有属性type
和visualIndex
。
此行的意思是:“查找
pieces
列表中的第一个元素,其中 type
设置为 pt
并且 visualIndex
设置为 visualIndex
”。
Pieces.Find(x => x.type == pt && x.visualIndex == visualIndex)
可以写成
Pieces.Find(singlePiece => singlePiece.type == pt && singlePiece.visualIndex == visualIndex)
翻译为:
“在集合“Pieces”中找到第一个类型为 pt 且其 VisualIndex 属性等于 VisualIndex 的元素”
“singlePiece”或“x”表示使用 Find 方法“找到”元素必须满足哪些条件。