2012-01-11 111 views
2

我正在尋找一個解決方案來執行linq查詢並忽略大小寫。我發現這個:Linq與string.Compare(...,...,...)混合

m_context.Users.SingleOrDefault(u => string.Compare(u.UserName, username, StringComparison.InvariantCultureIgnoreCase) == 0); 

它根據提供的用戶名搜索用戶對象,忽略大小寫。它的工作,這不是問題在這裏,但分析代碼時,我覺得很奇怪。我的意思是,在linq中,我們有string.Compare(...,...,...)返回一個整數。所以呢?它如何由linq(SingleOrDefault)管理?

感謝您的幫助。

回答

4

您正在將一個謂詞傳遞給SingleOrDefault方法。謂詞評估爲true或false,並且此方法返回滿足該謂詞的序列中的單個元素單個單元。

u => string.Compare(x, y, StringComparison.InvariantCultureIgnoreCase) == 0 

這是一個Func<User, bool>謂詞,這意味着它是接受用戶作爲參數u,並返回一個布爾值作爲string.Compare(...) == 0評價的結果的功能。然後返回用戶序列中的單個元素以滿足此條件。如果多於一個滿足謂詞,那就是錯誤。如果少於一個滿足謂詞,則會獲得該類型的默認值,對於引用類型而言,它只是空值。

認爲它是非常粗略

public static T SingleOrDefault<T>(this IEnumerable<T> sequence, Func<T, bool> predicate) 
{ 
    T foundItem = null; 
    int count = 0; 

    foreach (T item in sequence) 
    { 
      if (predicate(item)) // evaluates the u => string.Compare(...) 
      { 
       count += 1; 
       if (count > 1) 
        throw new InvalidOperationException("..."); 

       foundItem = item; 
      } 
    } 

    return foundItem; 
} 

上面又僅僅是我的方法做什麼,而不是實際執行的草稿。如果您有興趣對linq-to-objects實現進行更深入的研究,請考慮閱讀Jon Skeet的Edulinq系列,他會在這裏經過並重新實現每個(給定或採取)方法並在此過程中進行解釋。再說一遍,這不是庫的源代碼,但它非常具有教育意義。

+0

非常感謝。這對我來說很清楚。 – Bronzato 2012-01-11 13:34:42

1

您有string.Compare(...) == 0 - 即Boolean