C# List.Find方法 - 如何将值传递给谓词(predicate)?
C# List.Find方法 - 如何将值传递给谓词(predicate)?
我找不到如何在运行时使用一个值来进行 List 的“查找”。如果你看到我下面的代码,我想要能够找到 List 中 Path 参数等于 X 的 CustomClass,其中 X 将在运行时定义。有没有办法在 List 上进行这样的查找?或者除非编写迭代器并手动进行查找,否则这是不可能的吗?如果是这样的话,也许我应该考虑使用一个带键的集合?
代码:
private List
public void someMethod()
{
Uri u = new Uri(www.test.com);
CustomClass cc = this.files.Find(matchesUri(u)); // 无法执行此操作
}
private static bool matchesUri(List
{
return cc.Path == _u;
}
public class CustomClass
{
private Uri path;
public Uri Path
{
get { return this.path; }
set { this.path = value; }
}
}
附:我必须承认我对文档中关于谓词的内容不太明白,文档链接:http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx
C# List.Find方法 - 如何将值传递给谓词?
在C#中,如果想要在List中查找特定元素,可以使用List.Find方法。该方法接受一个谓词(Predicate)作为参数,用于确定元素是否满足特定条件。然而,有时候我们需要在谓词中使用额外的值,但是Find方法只接受一个谓词函数作为参数,不支持传递额外的值。
为了解决这个问题,可以使用Lambda表达式来传递额外的值给谓词。Lambda表达式是一种匿名函数,可以在定义时直接传递参数。下面是使用Lambda表达式解决此问题的示例代码:
Uri u = new Uri("www.test.com"); CustomClass cc = this.files.Find(item => item.Path == u);
在上面的代码中,我们使用Lambda表达式将变量u传递给谓词,使其可以在谓词中使用。Lambda表达式的语法为`item => item.Path == u`,其中`item`是List中的元素,`item.Path`是元素的某个属性,`u`是我们要传递的额外值。
然而,如果你不想使用Lambda表达式,还有另一种方法可以实现相同的功能。可以创建一个包含额外值的类,并在该类中定义谓词方法。下面是使用这种方法解决问题的示例代码:
// Predicate必须是一个只有一个参数的方法, // 所以我们必须通过构造函数将另一个参数传递进来 public class UriMatcher { private readonly Uri _u; public UriMatcher(Uri u) { _u = u; } // Match是一个Predicatepublic bool Match(CustomClass cc) { return cc.Path == _u; } } public void someMethod() { Uri u = new Uri("www.test.com"); UriMatcher matcher = new UriMatcher(u); CustomClass cc = this.files.Find(matcher.Match); }
在上面的代码中,我们创建了一个名为UriMatcher的类,其中包含一个属性_u和一个Match方法。Match方法是谓词方法,用于判断元素的Path属性是否等于传入的额外值_u。在someMethod方法中,我们创建了一个UriMatcher对象,并将其Match方法传递给List.Find方法作为谓词参数。
需要注意的是,我们在调用List.Find方法时,传递的是对谓词方法的引用,而不是调用谓词方法后的结果。这样做是因为List.Find方法内部会根据谓词方法的返回值来判断元素是否满足条件。
总结起来,要在C# List.Find方法中传递额外的值给谓词,可以使用Lambda表达式或者创建一个包含额外值的类并定义谓词方法。这样就可以在谓词中使用额外的值,从而实现特定的查找条件。
C# List.Find方法 - 如何将一个值传递给predicate?
在C#中,List类提供了一个Find方法,它允许我们根据条件查找列表中的元素。通常,我们可以使用lambda表达式作为谓词来定义条件。然而,有时候我们需要将一个值传递给谓词,以便在查找过程中使用它。
在这里,我们有一个示例代码:
CustomClass cc = this.files.Find(p => p.Path == u);
这段代码尝试通过路径(Path)属性查找一个CustomClass对象。路径(Path)的值存储在变量u中。然而,这样的写法会导致出现一个问题。
问题的原因是,Find方法的谓词参数是一个委托,它接受一个参数并返回一个布尔值。在上面的代码中,我们使用了一个lambda表达式作为谓词,但是我们没有办法将变量u传递给lambda表达式。
解决这个问题的方法是使用一个匿名函数,而不是lambda表达式。匿名函数允许我们将变量u作为参数传递给谓词,并在查找过程中使用它。
下面是使用匿名函数解决问题的示例代码:
CustomClass cc = this.files.Find(delegate(CustomClass p) { return p.Path == u; });
在这个示例中,我们使用了匿名函数来定义谓词。匿名函数接受一个参数p,并返回一个布尔值。我们可以在匿名函数中访问变量u,并在查找过程中使用它。
通过使用匿名函数,我们成功地将一个值传递给谓词,并解决了原来代码中的问题。
在C#中,当我们使用List的Find方法时,有时候我们需要将一个值传递给谓词,以便在查找过程中使用它。通过使用匿名函数,我们可以解决这个问题,并成功地找到符合条件的元素。
希望这篇文章对你有所帮助!
C# List.Find方法 - 如何将值传递到谓词?
问题的原因是,List.Find方法需要一个谓词作为参数,用于指定要搜索的元素的条件。谓词是一个函数,它接受一个参数并返回一个布尔值。在这种情况下,谓词用于比较CustomClass对象的Path属性与给定的Uri对象。
然而,问题是如何将Uri对象传递给谓词。最简单的解决方法是使用lambda表达式。lambda表达式允许我们在方法调用中内联定义一个匿名函数。我们可以编写一个lambda表达式来比较CustomClass对象的Path属性与给定的Uri对象。
下面是使用lambda表达式的示例代码:
Uri u = new Uri("www.test.com"); CustomClass cc = this.files.Find(cc => cc.Path == u);
这段代码中,我们使用lambda表达式cc => cc.Path == u来定义谓词。lambda表达式接受一个CustomClass对象cc作为参数,并将cc的Path属性与给定的Uri对象u进行比较。List.Find方法将使用这个lambda表达式来查找满足条件的CustomClass对象。
另一种解决方法是使用一个命名方法作为谓词。我们可以编写一个静态方法来比较CustomClass对象的Path属性与给定的Uri对象。
下面是使用命名方法的示例代码:
static bool matchesUri(CustomClass cc, Uri _u) { return cc.Path == _u; } Uri u = new Uri("www.test.com"); CustomClass cc = this.files.Find(cc => matchesUri(cc, u));
在这个例子中,我们定义了一个名为matchesUri的静态方法作为谓词。这个方法接受一个CustomClass对象cc和一个Uri对象_u作为参数,并比较cc的Path属性与_u。然后,我们在List.Find方法中使用这个命名方法作为谓词。
总之,要将值传递给List.Find方法的谓词,我们可以使用lambda表达式或命名方法。这些方法允许我们在方法调用中比较对象的属性与给定的值。