2016-03-30 47 views
-5

我有兩個代碼塊。我想知道他們是否相當如何正確添加Func到Linq?

properties = type.GetProperties() 
       .Where(IsNeverSerializedProperty) 
       .ToArray(); 

private static bool IsNeverSerializedProperty(PropertyInfo p) 
{ 
     return p.Name.Contains("Password") || 
       p.GetCustomAttributes(typeof(EncryptedConfigurationItemAttribute), false).Any(); 
} 

它是否等同於下面的代碼?

properties = type.GetProperties() 
       .Where(p => p.Name.Contains("Password")) 
       .Where(p => p.GetCustomAttributes(typeof(EncryptedConfigurationItemAttribute), true).Any())) 
       .ToArray(); 

如果它們不相同,我犯了什麼錯誤?

+1

它們並不相同,因爲您向'GetCustomAttributes'提供了不同的參數。但是,爲什麼不直接在調試器中嘗試一下,看看自己是否是? – HimBromBeere

+1

假設第二個示例的第3行上的'x'只是一個錯字,它們仍然不相同:第二個過濾所有名稱中包含「Password」_and_具有'EncryptedConfigurationItemAttribute'的屬性。第一個過濾這些條件的_either_屬性爲真的屬性。 – CompuChip

+0

將兩個Where方法的謂詞放在一個Where方法中:Where(p => p.Name.Contains(...)&& p.GetCustomerAttributes(...), –

回答

2

減少代碼到它的基本形式,你的第一個片段的形式

list.Where(p => NameContainsPassword(p) || HasEncryptedConfigurationItemAttribute(p)) 

,我的內聯函數IsNeverSerializedProperty的。

第二函數的形式爲

list 
    .Where(p => NameContainsPassword(p)) 
    .Where(p => HasEncryptedConfigurationItemAttribute(p)) 

其中第一過濾器,其NameContainsPassword(p)保持並然後從該過濾器中的所有項目,其HasEncryptedConfigurationItemAttribute保持的所有項目,因此,這等同於

list.Where(p => NameContainsPassword(p) && HasEncryptedConfigurationItemAttribute(p)) 

請注意,邏輯運算符不同(|| vs &&)。

2

它們並不等同。

IsNeverSerializedProperty檢查屬性名稱包含「密碼」 OR具有屬性EncryptedConfigurationItemAttribute而第二查詢檢查屬性名稱中包含「密碼」 屬性具有EncryptedConfigurationItemAttribute

+0

需要在'IsNeverSerializedProperty'中添加'&&'而不是'||'? – Anatoly

+0

是的,應該這樣做。 – RePierre