LINQ中,Single()、SingleOrDefault()的解析、示例


LINQ一般查詢到的結果是IEnumerable<T>集合類型,想要從中取出單一的元素,可以使用Single、First、Last、ElementAt等方法,以及它們帶有OrDefault的形式。

Single返回序列中的唯一元素,First、Last返回第一個、最后一個元素。

 

對比一下:

方法 序列為null時 序列不包含任何元素時 序列只包含一個元素時 序列包含多個元素時
Single 引發異常 引發異常 返回該元素 引發異常
SingleOrDefault 引發異常 返回default(TSource) 返回該元素 引發異常
First 引發異常 引發異常 返回該元素 返回第一個元素
FirstOrDefault 引發異常 返回default(TSource) 返回該元素 返回第一個元素
Last 引發異常 引發異常 返回該元素 返回最后一個元素
LastOrDefault 引發異常 返回default(TSource) 返回該元素 返回最后一個元素

 

 

 

 

 

 

 

 

 

 

 

 

Single、SingleOrDefault可以用來確保序列中不存在多個元素。

SingleOrDefault可以用來檢驗序列中是否包含有元素。引用類型的默認值default(T)為null,表示在序列中沒有找到元素。

 

下面來看一下Single、SingleOrDefault的實際使用。

 

1、用戶登錄:

public static User QueryUser(string code, string password)
{
    using (SQLiteConnection conn = new SQLiteConnection(connectionString))
    {
        string sql = "select * from User where Code = @Code and Password = @Password";
        var param = new { Code = code, Password = password };
        return conn.Query<User>(sql, param).SingleOrDefault();
    }
}        

在用戶表中,Code是唯一的,如果查詢出多個滿足條件的用戶,要拋異常;如果沒有查詢到用戶,返回null做進一步判斷處理。

 

2、將用戶表綁定到DataGrid后,單選一個用戶:

IEnumerable<User> query = (dataGrid.ItemsSource as IEnumerable<User>)
    .Where(user => user.IsChecked);

if (query.Count() == 0)
{
    MessageBox.Show("沒有選中");
    return;
}
if (query.Count() > 1)
{
    MessageBox.Show("不能多選");
    return;
}

User user = query.Single();

因為在之前判斷過序列的元素數量,所以調用Single取出用戶就不會有問題了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM