gpt4 book ai didi

c# - 如何找到 List 中的特定元素?

转载 作者:IT王子 更新时间:2023-10-29 03:35:40 24 4
gpt4 key购买 nike

我的应用程序使用这样的列表:

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

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

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

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

如何找到 MyClass 的特定实例通过使用 GetId方法?我知道有 Find方法,但我不知道这是否适用于此?!

最佳答案

使用 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 是仅在集合访问器中已知的上下文关键字。它表示分配给属性的值。

由于经常使用这种模式,C# 提供了auto-implemented properties .它们是上面代码的简短版本;然而,支持变量是隐藏的并且不可访问(但是在 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。如果你也需要在派生类中设置它,你也可以保护 setter

public string Id { get; protected set; }

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


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

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

您也可以改为在构造函数中初始化 getter-only 属性。 Getter-only 自动属性是真正只读属性,这与带有私有(private) setter 的自动实现属性不同。

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

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 Compiler Platform ("Roslyn")
New Language Features in 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;.

从 C# 9.0 开始,您可以使用可在对象初始化程序中初始化的只读(或更好的初始化一次)属性。这对于 getter-only 属性目前是不可能的。

public string Name { get; init; }

var c = new C { Name = "c-sharp" };

从 C# 11 开始,您可以使用 required 属性来强制客户端代码对其进行初始化。

field 关键字计划用于 C# 的 future 版本(它没有进入 C# 11)并允许访问自动创建的支持字段。

// Removes time part in setter
public DateTime HiredDate { get; init => field = value.Date(); }

public Data LazyData => field ??= new Data();

关于c# - 如何找到 List<T> 中的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com