您正在將一個謂詞傳遞給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系列,他會在這裏經過並重新實現每個(給定或採取)方法並在此過程中進行解釋。再說一遍,這不是庫的源代碼,但它非常具有教育意義。
非常感謝。這對我來說很清楚。 – Bronzato 2012-01-11 13:34:42