我怎样才能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 } }