使用LINQ如果項目可能不存在於列表中,從列表中選擇單個項目的最佳方式是什麼?從列表中選擇單個項目
我想出了兩個解決方案,我都不喜歡。我使用where子句來選擇項目列表(我知道它只是一個項目),然後我可以檢查計數並在此列表中進行單一調用(如果count爲1),則另一種選擇是使用foreach獲得該項目後休息。
這些都不是一個好方法,有沒有更好的方法?
使用LINQ如果項目可能不存在於列表中,從列表中選擇單個項目的最佳方式是什麼?從列表中選擇單個項目
我想出了兩個解決方案,我都不喜歡。我使用where子句來選擇項目列表(我知道它只是一個項目),然後我可以檢查計數並在此列表中進行單一調用(如果count爲1),則另一種選擇是使用foreach獲得該項目後休息。
這些都不是一個好方法,有沒有更好的方法?
您可以使用IEnumerable.First()
或IEnumerable.FirstOrDefault()
。
不同之處在於,如果找不到元素(或者如果沒有元素與條件匹配(如果使用條件),則會拋出First()
)。 FirstOrDefault()
將返回default(T)
(null
如果它是一個引用類型)。
也許我在這裏丟失了一些東西,但通常調用.SingleOrDefault()
是要返回列表中單個元素的方式,或者是列表爲空的默認值(引用或可爲空的類型爲null)。 如果列表包含多個元素,則會生成一個異常。
使用FirstOrDefault()
照顧的情況下,你可能有不止一個)
List<string> items = new List<string>();
items.Find(p => p == "blah");
或
items.Find(p => p.Contains("b"));
但是這允許您定義您通過比賽謂詞找什麼...
我想如果你在說linqToSql那麼:
例如尋找帳戶...
DataContext dc = new DataContext();
Account item = dc.Accounts.FirstOrDefault(p => p.id == 5);
如果您需要確保只有1個項目(拋出異常多的時候1)
DataContext dc = new DataContext();
Account item = dc.Accounts.SingleOrDefault(p => p.id == 5);
有兩種簡單的方法,這取決於如果你想處理異常或獲得默認值。
您可以使用First<T>()
或FirstOrDefault<T>()
擴展方法來獲得第一個結果或default(T)
。
var list = new List<int> { 1, 2, 4 };
var result = list.Where(i => i == 3).First(); // throws InvalidOperationException
var result = list.Where(i => i == 3).FirstOrDefault(); // = 0
使用FirstOrDefault選擇器。
var list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var firstEven = list.FirstOrDefault(n => n % 2 == 0);
if (firstEven == 0)
Console.WriteLine("no even number");
else
Console.WriteLine("first even number is {0}", firstEven);
只是傳遞一個謂詞的First或FirstOrDefault方法,它會高興地去圓」的名單,並挑選第一場比賽爲您服務。
如果沒有匹配,FirstOrDefault將返回列表項的任何數據類型的默認值。
希望這有助於:-)
SingleOrDefault()
是你所需要的
歡呼
只是爲了完成答案,如果你正在使用LINQ語法,你可以把它包起來,因爲它返回一個IEnumerable:
(from int x in intList
where x > 5
select x * 2).FirstOrDefault()
剛纔看到現在這個樣子,如果您正在使用對象的列表,您可以嘗試這個
public class user
{
public string username { get; set; }
public string password { get; set; }
}
List<user> userlist = new List<user>();
userlist.Add(new user { username = "macbruno", password = "1234" });
userlist.Add(new user { username = "james", password = "5678" });
string myusername = "james";
string mypassword = "23432";
user theUser = userlist.Find(
delegate (user thisuser)
{
return thisuser.username== myusername && thisuser.password == mypassword;
}
);
if (theUser != null)
{
Dosomething();
}
else
{
DoSomethingElse();
}
太簡單了,不知道我是怎麼錯過的。謝謝。 – Daniel 2009-04-09 18:04:42