我的应用程序使用了列表如下:如何找到列表中的特定元素<T>?
List<MyClass> list = new List<MyClass>();
使用Add
法,MyClass
另一个实例被添加到列表中。
MyClass
提供,除其他外,下列方法:
public void SetId(String Id);
public String GetId();
我如何使用GetId
方法来找到MyClass
具体的实例?我知道有Find
方法,但我不知道这是否会在这里工作?!
我的应用程序使用了列表如下:如何找到列表中的特定元素<T>?
List<MyClass> list = new List<MyClass>();
使用Add
法,MyClass
另一个实例被添加到列表中。
MyClass
提供,除其他外,下列方法:
public void SetId(String Id);
public String GetId();
我如何使用GetId
方法来找到MyClass
具体的实例?我知道有Find
方法,但我不知道这是否会在这里工作?!
使用lambda表达式
MyClass result = list.Find(x => x.GetId() == "xy");
注:C#有一个内置的语法特性。而不是写套装 - 和Get-方法,写
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
声明属性,并覆盖它们在派生类,允许你提供不同的实现获得者和制定者;就像普通的虚拟方法一样。
因为C#6。0(Visual Studio的2015年,罗斯林),你可以用一个内联初始化
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
您也可以在构造函数中仅初始化消气属性,而不是只写消气自动性质。 Getter-only自动属性是true只读属性,与使用私有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
}
注意,在这种情况下,二传手必须是一个表达式。这不能是一个声明。上面的例子可以工作,因为在C#中,赋值可以用作表达式或语句。赋值表达式的值是赋值本身是副作用的赋值。这使您可以将值分配给一个以上的变量:x = y = z = 0
相当于x = (y = (z = 0))
,与语句x = 0; y = 0; 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);
可以最简洁的解决你的问题用一个使用匿名方法语法编写的谓词:
MyClass found = list.Find(item => item.GetID() == ID);
您还可以使用LINQ扩展:
string id = "hello";
MyClass result = list.Where(m => m.GetId() == id).First();
或其他重载First:'MyClass result = list.First(m => m.GetId()== id); ' – 2012-03-24 19:55:41
或者,如果你不喜欢使用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
}
}
伟大的答案,谢谢。对于数据库操作,它看起来像这样: 'IQueryable result = db.Set ().Find(// just id here //)。ToList();' 它已经知道你正在寻找主键。仅供参考。 –
Edgar
2014-10-09 19:34:51
我知道这是一个古老的答案,但我会分开get和set到不同的方法,以便在比较过程中不会意外设置值。 – 2016-10-11 19:08:59
@JoelTrauger:比较读取属性,因此只调用getter。 – 2016-10-11 19:36:09