我的應用程序使用了列表如下:如何找到列表中的特定元素<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