C# List.Find方法 - 如何将值传递给谓词(predicate)?

29 浏览
0 Comments

C# List.Find方法 - 如何将值传递给谓词(predicate)?

我找不到如何在运行时使用一个值来进行 List 的“查找”。如果你看到我下面的代码,我想要能够找到 List 中 Path 参数等于 X 的 CustomClass,其中 X 将在运行时定义。有没有办法在 List 上进行这样的查找?或者除非编写迭代器并手动进行查找,否则这是不可能的吗?如果是这样的话,也许我应该考虑使用一个带键的集合?

代码:

private List files;

public void someMethod()

{

Uri u = new Uri(www.test.com);

CustomClass cc = this.files.Find(matchesUri(u)); // 无法执行此操作

}

private static bool matchesUri(List cc, Uri _u)

{

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

0
0 Comments

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是一个Predicate
    public 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表达式或者创建一个包含额外值的类并定义谓词方法。这样就可以在谓词中使用额外的值,从而实现特定的查找条件。

0
0 Comments

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方法时,有时候我们需要将一个值传递给谓词,以便在查找过程中使用它。通过使用匿名函数,我们可以解决这个问题,并成功地找到符合条件的元素。

希望这篇文章对你有所帮助!

0
0 Comments

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表达式或命名方法。这些方法允许我们在方法调用中比较对象的属性与给定的值。

0