2012-03-24 70 views
70

我的应用程序使用了列表如下:如何找到列表中的特定元素<T>?

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

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

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

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

我如何使用GetId方法来找到MyClass具体的实例?我知道有Find方法,但我不知道这是否会在这里工作?!

回答

172

使用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;具有相同的效果。

+2

伟大的答案,谢谢。对于数据库操作,它看起来像这样: 'IQueryable result = db.Set ().Find(// just id here //)。ToList();' 它已经知道你正在寻找主键。仅供参考。 – Edgar 2014-10-09 19:34:51

+0

我知道这是一个古老的答案,但我会分开get和set到不同的方法,以便在比较过程中不会意外设置值。 – 2016-10-11 19:08:59

+0

@JoelTrauger:比较读取属性,因此只调用getter。 – 2016-10-11 19:36:09

14
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(); 
7

尝试:

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

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

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

您还可以使用LINQ扩展:

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

或其他重载First:'MyClass result = list.First(m => m.GetId()== id); ' – 2012-03-24 19:55:41

3

或者,如果你不喜欢使用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 
    } 
} 
相关问题