一尘不染

如何在列表中找到特定元素?

c#

我的应用程序使用如下列表:

List<MyClass> list = new List<MyClass>();

使用该Add方法,会将的另一个实例MyClass添加到列表中。

MyClass 除其他外,提供以下方法:

public void SetId(String Id);
public String GetId();

如何MyClass使用GetId方法找到特定的实例?我知道有Find办法,但是我不知道这在这里行得通吗?


阅读 480

收藏
2020-05-19

共1个答案

一尘不染

使用lambda表达式

MyClass result = list.Find(x => x.GetId() == "xy");

注意:C#具有属性的内置语法。而不是编写getter和setter方法(您可能习惯于Java),而是编写

private string _id;
public string Id
{
    get
    {
        return _id;
    }
    set
    {
        _id = value;
    }
}

value是仅在set访问器中已知的上下文关键字。它代表分配给属性的值。

由于经常使用此模式,因此C#提供了 自动实现的属性。它们是上面代码的简短版本;但是,后备变量是隐藏的并且不可访问(但是可以从VB中的类内部访问)。

public string Id { get; set; }

您可以像访问字段一样简单地使用属性:

var obj = new MyClass();
obj.Id = "xy";       // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id;  // Calls the getter.

使用属性,您可以像这样在列表中搜索项目

MyClass result = list.Find(x => x.Id == "xy");

如果需要只读属性,也可以使用自动实现的属性:

public string Id { get; private set; }

这使您可以Id在类中进行设置,但不能从外部进行设置。如果您还需要在派生类中进行设置,则还可以保护设置器

public string Id { get; protected set; }

最后,您可以将属性声明为virtual,并在派生类中重写它们,从而允许您为getter和setter提供不同的实现。就像普通的虚拟方法一样。


从C#6.0(Visual Studio 2015,Roslyn)开始,您可以使用内联初始化程序编写仅吸气剂的自动属性

public string Id { get; } = "A07"; // Evaluated once when object is initialized.

您也可以在构造函数中初始化纯getter属性。仅限吸气剂的自动属性是 真正的 只读属性,与带有私有设置程序的自动实现的属性不同。

这也适用于读写自动属性:

public string Id { get; set; } = "A07";

从C#6.0开始,您还可以将属性编写为表达式强成员

public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }

请参阅:.NET编译器平台(“ Roslyn”)
C#6中的新语言功能

C#7.0开始,getter和setter都可以用表达式主体编写:

public string Name
{
    get => _name;                                // getter
    set => _name = value;                        // setter
}

请注意,在这种情况下,setter必须是一个表达式。它不能是声明。上面的示例有效,因为在C#中,赋值可以用作表达式或语句。赋值表达式的值是赋值值,其中赋值本身是一个副作用。这样,您可以一次将一个值分配给多个变量:与这些语句x = y = z = 0等效x = (y = (z = 0))并具有相同的作用x = 0; y = 0; z = 0;

2020-05-19