2012-03-24 68 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 
    } 
} 
相關問題