我怎样才能find一个List <T>中的特定元素?

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

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

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

MyClass提供了以下方法:

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

如何通过使用GetId方法findMyClass的特定实例? 我知道有Find方法,但我不知道这是否会在这里工作?!

使用lambdaexpression式

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

注意:C#有一个内置的属性语法。 写,而不是写Set和Get方法

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

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

由于这种模式经常被使用,C#提供了自动实现的属性。 它们是上面代码的简短版本; 然而,支持variables是隐藏的,不可访问(但是可以从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. 

使用属性,你会像这样search列表中的项目

 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自动属性是真正的只读属性,不像自动实现的属性与私人setter。

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

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

从C#6.0开始,您也可以将属性写为expression式成员

 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都可以用expression式体来编写:

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

请注意,在这种情况下,setter必须是一个expression式。 这不能是一个声明。 上面的例子工作,因为在C#中,一个赋值可以用作expression式或语句。 赋值expression式的值是赋值。 任务本身是一个副作用。 这允许您将值分配给一个以上的variables: x = y = z = 0相当于x = (y = (z = 0))

 var list = new List<MyClass>(); var item = list.Find( x => x.GetId() == "TARGET_ID" ); 

或者如果只有一个,你想强制像SingleOrDefault可能是你想要的东西

 var item = list.SingleOrDefault( x => x.GetId() == "TARGET" ); if ( item == null ) throw new Exception(); 

尝试:

  list.Find(item => item.id==myid); 

你也可以使用LINQ扩展:

 string id = "hello"; MyClass result = list.Where(m => m.GetId() == id).First(); 

你可以用一个使用匿名方法语法编写的谓词来简洁地解决你的问题:

 MyClass found = list.Find(item => item.GetID() == ID); 

或者,如果你不喜欢使用LINQ,你可以按照老派的方式来做:

 List<MyClass> list = new List<MyClass>(); foreach (MyClass element in list) { if (element.GetId() == "heres_where_you_put_what_you_are_looking_for") { break; // If you only want to find the first instance a break here would be best for your application } }