2016-03-30 9 views
-5

私は2ブロックのコードを持っています。彼らが同等かどうか疑問に思っていた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

2番目の例の3行目の 'x'が単にタイプミスであると仮定すると、それらは依然として同等ではありません:2番目のプロパティは、名前に" EncryptedConfigurationItemAttribute "を持つ" Password "_and_を含むすべてのプロパティをフィルタリングします。最初のものは、これらの条件のいずれかが真であるプロパティをフィルタリングします。 – CompuChip

+0

両方のWhereメソッドの述語を1つのWhereメソッドに入れる方が効率的ではないでしょうか。.Where(p => p.Name.Contains(...)&& p.GetCustomerAttributes(...)、 –

答えて

2

、あなたの最初のスニペットは、フォーム、私はあなたのIsNeverSerializedProperty機能をインライン化

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

です。第二の機能は、フォーム

最初 NameContainsPassword(p)が成立するためにすべてのアイテムをフィルタリングし、そのフィルタから
list 
    .Where(p => NameContainsPassword(p)) 
    .Where(p => HasEncryptedConfigurationItemAttribute(p)) 

である

HasEncryptedConfigurationItemAttributeが成立するためにすべての項目、したがってこれは

list.Where(p => NameContainsPassword(p) && HasEncryptedConfigurationItemAttribute(p)) 
と等価です

論理演算子が異なることに注意してください(||&&)。

2

これらは同等ではありません。

IsNeverSerializedPropertyチェックプロパティ名は、ORを「パスワード」が含まれている場合、プロパティ名は、「パスワード」プロパティがEncryptedConfigurationItemAttributeを持っている含まれている場合は、2番目のクエリをチェックし、一方、属性EncryptedConfigurationItemAttributeを持っています。その基本的なフォームにコードを削減

+0

'IsNeverSerializedProperty'に' || 'の代わりに' && 'を追加する必要がありますか? – Anatoly

+0

はい、それは必要です。 – RePierre

関連する問題